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

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

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

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

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

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

Ответ 1

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

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

Ответ 2

Преимущество следующего подхода заключается в том, что файл правильно закрыт на конце блока, даже если на пути возникло исключение. Это эквивалентно 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.

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

Мой ответ:

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.

Ответ 8

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

w+  create file if it does not exist and open it in write mode
r+  open for reading and writing. Does not create file.
a+  create file if it does not 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]

Ответ 9

Начиная с 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)

Ответ 10

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

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

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

Ответ 11

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

Ответ 12

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

Ответ 13

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

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 позаботиться об этом за вас.

Ответ 14

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

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

Ответ 15

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

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

Ответ 16

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)