Каков наилучший способ открыть файл как чтение/запись, если он существует, или если он этого не сделает, тогда создайте его и откройте его как чтение/запись? Из того, что я читал, file = open('myfile.dat', 'rw')
должен сделать это, правильно?
Он не работает для меня (Python 2.6.2), и мне интересно, является ли это проблемой версии или не должно работать так или иначе.
Суть в том, что мне просто нужно решение проблемы. Мне интересно узнать о других вещах, но все, что мне нужно, это хороший способ сделать открытую часть.
UPDATE: вложенная директория была записана пользователем и группой, а не другими (я нахожусь в системе Linux... так что разрешения 775 иными словами), и точная ошибка:
IOError: нет такого файла или каталога.
Вы должны использовать open
с w+
:
file = open('myfile.dat', 'w+')
w
усекает существующий файл. Документы: Режимы 'r+'
, 'w+'
и 'a+'
открывают файл для обновления (обратите внимание, что 'w+'
усекает файл).
Преимущество следующего подхода заключается в том, что файл правильно закрыт на конце блока, даже если на пути возникло исключение. Это эквивалентно 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.
filename
?
>>> import os
>>> if os.path.exists("myfile.dat"):
... f = file("myfile.dat", "r+")
... else:
... f = file("myfile.dat", "w")
r + означает чтение/запись
Хорошей практикой является использование следующих функций:
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')
Измените "rw" на "w +"
Или используйте 'a +' для добавления (не стирая существующий контент)
Мой ответ:
file_path = 'myfile.dat'
try:
fp = open(file_path)
except IOError:
# If not exists, create the file
fp = open(file_path, 'w+')
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
.
Я думаю, что это r +, а не rw. Я просто стартер, и это то, что я видел в документации.
Что вы хотите делать с файлом? Только писать или читать и писать?
'w', 'a' позволит писать и будет создавать файл, если он не существует.
Если вам нужно прочитать из файла, файл должен существовать до его открытия. Вы можете проверить его существование, прежде чем открывать его или использовать try/except.
Начиная с 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)
Положите w + для записи файла, усекая, если он существует, r +, чтобы прочитать файл, создав его, если он не существует, но не записывает (и возвращает null) или + для создания нового файла или добавления к существующему.
Использование:
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
сделает это за вас.
Если вы хотите открыть его для чтения и записи, я предполагаю, что вы не хотите усекать его при его открытии, и вы хотите, чтобы он мог прочитать файл сразу после его открытия. Итак, это решение, которое я использую:
file = open('myfile.dat', 'a+')
file.seek(0, 0)
'''
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
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)
Итак, вы хотите записать данные в файл, но только если он еще не существует?.
Эту проблему легко решить, используя малоизвестный режим 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.