open () в Python не создает файл, если он не существует - PullRequest
564 голосов
/ 03 июня 2010

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

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

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

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

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

Ответы [ 16 ]

719 голосов
/ 03 июня 2010

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

file = open('myfile.dat', 'w+')
113 голосов
/ 12 марта 2013

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

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

a + Открывает файл для добавления и чтения. Указатель файла в конце файла, если файл существует. Файл открывается в режим добавления. Если файл не существует, он создает новый файл для чтение и письмо. - Режимы файлов 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 .

31 голосов
/ 04 мая 2015

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

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')
30 голосов
/ 03 июня 2010
>>> import os
>>> if os.path.exists("myfile.dat"):
...     f = file("myfile.dat", "r+")
... else:
...     f = file("myfile.dat", "w")

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

26 голосов
/ 03 июня 2010

Измените "rw" на "w +"

Или используйте «+» для добавления (не стирая существующий контент)

14 голосов
/ 27 мая 2014

Мой ответ:

file_path = 'myfile.dat'
try:
    fp = open(file_path)
except IOError:
    # If not exists, create the file
    fp = open(file_path, 'w+')
8 голосов
/ 23 апреля 2018

Начиная с 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)
7 голосов
/ 03 июня 2010

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 голосов
/ 22 июня 2013

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

6 голосов
/ 03 июня 2010

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

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

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

...