open () в Python не создает файл, если он не существует


662

Каков наилучший способ открыть файл для чтения / записи, если он существует, а если нет, то создать его и открыть как чтение / запись? Из того, что я прочитал, file = open('myfile.dat', 'rw')должен делать это, верно?

Это не работает для меня (Python 2.6.2), и мне интересно, если это проблема с версией, или не должен работать так или что.

Суть в том, что мне просто нужно решение проблемы. Мне любопытно по поводу других вещей, но все, что мне нужно, это хороший способ сделать вступительную часть.

Вмещающий каталог был доступен для записи пользователю и группе, а не другим (я в системе Linux ... так что разрешения 775 другими словами), и точная ошибка была:

IOError: нет такого файла или каталога.


2
Как отметил С.Марк, это должно «просто работать». Является ли вмещающий каталог доступным для записи?
Ракис

10
"это не работает для меня"? Что это значит конкретно? Пожалуйста, предоставьте фактическое сообщение об ошибке.
С.Лотт

5
Ответ muksie, приведенный ниже, сработал (и Baloo тоже в этом отношении), но только для полноты, включающий dir был доступен для записи пользователю и группе, а не другим (im в системе Linux ... так что разрешения 775 другими словами), и точному ошибка была IOError: нет такого файла или каталога. Спасибо за помощь, ребята.
trh178

@ S.Lott: готово. прости за это.
trh178

убедитесь , что все ведущие папки из fileсуществует.
Джейсон Гол

Ответы:


804

Вы должны использовать openс w+режимом:

file = open('myfile.dat', 'w+')

110
wобрезает существующий файл. документы: Режимы 'r+', 'w+'и 'a+'открыть файл для обновления (заметим , что 'w+'обрезает файл).
SilentGhost

4
это добилось цели. благодарю вас. теперь я чувствую себя идиотом за то, что не читал спецификацию. я не думаю, что «RW» там даже приемлемо. Должно быть, я думал о чем-то еще.
trh178

72
Обратите внимание, что + создает файл, если он не существует, и, что особенно важно, ищет файл до конца. Так что если вы сделаете чтение сразу после открытия этого пути, вы ничего не получите. Сначала нужно вернуться к началу: f.seek (0)
Ник Залуцкий


121
Это не решение. Проблема является каталогом . Либо у сценария отсутствуют разрешения на создание файла в этом каталоге, либо каталог просто не существует. open('myfile.dat', 'w')тогда достаточно.
Даниэль Ф

137

Преимущество следующего подхода заключается в том, что файл правильно закрывается в конце блока, даже если на пути возникает исключение. Это эквивалентно try-finally, но намного короче.

with open("file.dat","a+") as f:
    f.write(...)
    ...

+ открывает файл как для добавления, так и для чтения. Указатель файла находится в конце файла, если файл существует. Файл открывается в режиме добавления. Если файл не существует, он создает новый файл для чтения и записи. - режимы файлов Python

Метод seek () устанавливает текущую позицию файла.

f.seek(pos [, (0|1|2)])
pos .. position of the r/w pointer
[] .. optionally
() .. one of ->
  0 .. absolute position
  1 .. relative position to current
  2 .. relative position from end

Разрешены только символы "rwab +"; должен быть точно один из «rwa» - смотрите вопрос о режимах переполнения стека в Python-файле .


1
Я пытаюсь сделать это с помощью open (filename, 'a +') в качестве myfile: и получаю IOError: [Errno 2] Нет такого файла или каталога: - почему он не создает файл?
Лоретта

@Loretta Вы проверили значение filename?
Qwerty

Да, я сделал. Это строка в кодировке Юникод. Я также попытался с open ('{}. Txt'.format (имя файла),' a + ') как myfile:
Loretta

Я не использую путь. и я попытался открыть ('test.txt', 'a +'), он получает следующее исключение 'TypeError: приведение к Unicode: нужна строка или буфер, файл найден' в строке, если os.stat (myfile) .st_size == 0:
Лоретта

Вы должны правильно определить кодировку, чтобы это работало. stackoverflow.com/q/728891/3701431
Сергей Колодяжный

31

Хорошей практикой является использование следующего:

import os

writepath = 'some/path/to/file.txt'

mode = 'a' if os.path.exists(writepath) else 'w'
with open(writepath, mode) as f:
    f.write('Hello, world!\n')

18
Перед открытием файла плохо тестировать, так как это может привести к состязанию (файл удаляется до его открытия). Расовые условия могут иногда использоваться для использования уязвимостей в системе. Режим «+» - лучший способ открыть файл: он создает новый файл и добавляет к существующим файлам. Не забудьте обернуть это в попытке / кроме.
sleblanc

Режим вычисления записи или добавления не имеет интереса. Если файл не существует, режим добавления создает его.
Жан-Франсуа Фабр


25
>>> import os
>>> if os.path.exists("myfile.dat"):
...     f = file("myfile.dat", "r+")
... else:
...     f = file("myfile.dat", "w")

r + означает чтение / запись



38
еще хуже, этот код склонен к состоянию гонки. таким образом, после проверки, существует ли файл, процесс может быть прерван, и другой процесс может создать этот файл.
Антибус

Вам также понадобится флаг "w +", чтобы оба файла находились в режимах чтения и записи.
Мэтт

15

Начиная с python 3.4, вы должны использовать, pathlibчтобы «трогать» файлы.
Это гораздо более элегантное решение, чем предложенные в этой теме.

from pathlib import Path

filename = Path('myfile.txt')
filename.touch(exist_ok=True)  # will create file, if it exists will do nothing
file = open(filename)

То же самое с каталогами:

filename.mkdir(parents=True, exist_ok=True)

2
touchобновляет время последнего изменения при использовании.
Дэвид Паркс

@DavidParks хорошая мысль, только что проверил, и это действительно так в файловой системе ext4 и python3.7.2. Я не думаю, что это намеренное или желаемое поведение, может быть, это ошибка с питоном?
Гранитозавр

3
То же самое при использовании touchв командной строке в Linux, поэтому я предполагаю, что это предполагаемое поведение.
Дэвид Паркс


9
'''
w  write mode
r  read mode
a  append mode

w+  create file if it doesn't exist and open it in write mode
r+  open for reading and writing. Does not create file.
a+  create file if it doesn't exist and open it in append mode
'''

пример:

file_name = 'my_file.txt'
f = open(file_name, 'w+')  # open file in write mode
f.write('python rules')
f.close()

Надеюсь, это поможет. [FYI использую версию Python 3.6.2]


6

open('myfile.dat', 'a') у меня работает, просто отлично.

в py3k ваш код повышается ValueError:

>>> open('myfile.dat', 'rw')
Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    open('myfile.dat', 'rw')
ValueError: must have exactly one of read/write/append mode

в python-2.6 он поднимается IOError.


6

Использование:

import os

f_loc = r"C:\Users\Russell\Desktop\myfile.dat"

# Create the file if it does not exist
if not os.path.exists(f_loc):
    open(f_loc, 'w').close()

# Open the file for appending and reading
with open(f_loc, 'a+') as f:
    #Do stuff

Примечание: Файлы должны быть закрыты после того, как вы откроете их, и с менеджером контекста является хорошим способом , чтобы позволить Python заботиться об этом для вас.


6

Что вы хотите сделать с файлом? Только пишешь в него или и читаешь и пишешь?

'w', 'a'разрешит запись и создаст файл, если он не существует.

Если вам нужно прочитать из файла, файл должен существовать, прежде чем открыть его. Вы можете проверить его существование перед тем, как открыть его, или использовать попытку / исключение.


5
Проверка на существование перед открытием может привести к состоянию гонки. Вероятно, не имеет большого значения в этом случае, но что-то иметь в виду.
Даниэль Хеппер

1
«Если вам нужно прочитать из файла, файл должен существовать, прежде чем открыть его». Спасибо за спасение моего здравомыслия.
Брайан Петерсон

5

Я думаю r+, что нет rw. Я просто начинающий, и это то, что я видел в документации.


4

Поставьте w + для записи файла, обрезать, если он существует, r +, чтобы прочитать файл, создать его, если он не существует, но не записать (и вернуть ноль), или + для создания нового файла или добавления к существующему.


1

Итак, вы хотите записать данные в файл, но только если он еще не существует?

Эта проблема легко решается с помощью малоизвестного режима x для open () вместо обычного режима w. Например:

 >>> with open('somefile', 'wt') as f:
 ...     f.write('Hello\n')
...
>>> with open('somefile', 'xt') as f:
...     f.write('Hello\n')
...
 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
FileExistsError: [Errno 17] File exists: 'somefile'
  >>>

Если файл в двоичном режиме, используйте режим xb вместо xt.


1

Если вы хотите открыть его для чтения и записи, я предполагаю, что вы не хотите обрезать его при открытии и хотите иметь возможность прочитать файл сразу после его открытия. Так что это решение, которое я использую:

file = open('myfile.dat', 'a+')
file.seek(0, 0)

0

может быть это поможет

первый модуль os для импорта в ваш файл py

import os

затем создайте переменную с именем save_file и установите для нее файл, который вы хотите сделать html или txt, в этом случае txt файл

save_file = "history.txt"

затем определите функцию, которая будет использовать метод файла os.path.is, чтобы проверить, существует ли файл, и если нет, он создаст файл

def check_into():
if os.path.isfile(save_file):
    print("history file exists..... \nusing for writting....")
else:
    print("history file not exists..... \ncreating it..... ")
    file = open(save_file, 'w')
    time.sleep(2)
    print('file created ')
    file.close()

и, наконец, вызвать функцию

check_into()

-2
import os, platform
os.chdir('c:\\Users\\MS\\Desktop')

try :
    file = open("Learn Python.txt","a")
    print('this file is exist')
except:
    print('this file is not exist')
file.write('\n''Hello Ashok')

fhead = open('Learn Python.txt')

for line in fhead:

    words = line.split()
print(words)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.