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

513

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

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

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

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

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

  • 2
    Как отметил С.Марк, это должно «просто работать». Является ли вмещающий каталог доступным для записи?
  • 10
    "это не работает для меня"? Что это значит конкретно? Пожалуйста, предоставьте фактическое сообщение об ошибке.
Показать ещё 2 комментария
Теги:
file-permissions
file-io

16 ответов

658
Лучший ответ

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

file = open('myfile.dat', 'w+')
  • 81
    w усекает существующий файл. Документы: Режимы 'r+' , 'w+' и 'a+' открывают файл для обновления (обратите внимание, что 'w+' усекает файл).
  • 4
    это добилось цели. благодарю вас. теперь я чувствую себя идиотом за то, что не читал спецификацию. Я не думаю, что «RW» там даже приемлемо. Должно быть, я думал о чем-то еще.
Показать ещё 7 комментариев
95

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

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

a + Открывает файл для добавления и чтения. Указатель файла в конце файла, если файл существует. Файл открывается в append mode. Если файл не существует, он создает новый файл для чтение и письмо. - Режимы файла 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] Нет такого файла или каталога: - почему он не создает файл?
  • 0
    @Loretta Вы проверили значение имени filename ?
Показать ещё 4 комментария
30
>>> import os
>>> if os.path.exists("myfile.dat"):
...     f = file("myfile.dat", "r+")
... else:
...     f = file("myfile.dat", "w")

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

Показать ещё 1 комментарий
28

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

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')
  • 9
    Тестировать файл перед его открытием плохо, так как это может привести к гонке (файл удаляется до его открытия). Расовые условия могут иногда использоваться для использования уязвимостей в системе. Режим «+» - лучший способ открыть файл: он создает новый файл и добавляет к существующим файлам. Не забудьте обернуть это в попытке / кроме.
23

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

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

13

Мой ответ:

file_path = 'myfile.dat'
try:
    fp = open(file_path)
except IOError:
    # If not exists, create the file
    fp = open(file_path, 'w+')
7

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

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

6

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

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

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

  • 4
    Проверка на существование перед открытием может привести к состоянию гонки. Вероятно, не имеет большого значения в этом случае, но что-то иметь в виду.
  • 1
    «Если вам нужно прочитать из файла, файл должен существовать, прежде чем открыть его». Спасибо за спасение моего здравомыслия.
5

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

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)
5

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

4

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

import os

f_loc = r"C:\Users\Russell\Desktop\ip_addr.txt"

if not os.path.exists(f_loc):
    open(f_loc, 'w').close()

with open(f_loc) as f:
    #Do stuff

Убедитесь, что вы закрыли файлы после их открытия. Диспетчер контекста with сделает это за вас.

2

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

file = open('myfile.dat', 'a+')
file.seek(0, 0)
2
'''
w  write mode
r  read mode
a  append mode

w+  create file if it doesn't exist and open it in write mode
r+  create file if it doesn't exist and open it in read mode
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

0
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)
0

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

Эту проблему легко решить, используя малоизвестный режим x для открытия() вместо обычного режима 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню