2010-06-03 1 views
456

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

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

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

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

IOError: no such file or directory.

+2

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

+8

«Это не работает для меня»? Что это значит, в частности? Предоставьте фактическое сообщение об ошибке. –

+4

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

ответ

578

Вы должны использовать file = open('myfile.dat', 'w+')

+73

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

+4

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

+55

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

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 

в питон-2.6 повышает IOError.

23

Изменить "RW" в "ш +"

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

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

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

+38

Это Unpythonic. Вместо [проверки, существует ли файл в первую очередь] (http://docs.python.org/3/glossary.html#term-lbyl), следует [предполагать, что он делает это сначала, а затем обрабатывать случай, если это не так) (http://docs.python.org/3/glossary.html#term-eafp). –

+20

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

6

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

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

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

+3

Тестирование на наличие перед открытием может привести к состоянию гонки. Наверное, это не так уж и важно, но нужно помнить. –

+1

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

90

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

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

a+ Opens a file for both appending and reading. The file pointer is at the end of the file if the file exists. The file opens in the append mode. If the file does not exist, it creates a new file for reading and writing. - Python file modes

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

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 

Only "rwab+" characters are allowed; there must be exactly one of "rwa" - see Stack Overflow question Python file modes detail.

+0

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

+0

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

+0

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

7

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

11

Мой ответ:

file_path = 'myfile.dat' 
try: 
    fp = open(file_path) 
except IOError: 
    # If not exists, create the file 
    fp = open(file_path, 'w+') 
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 сделает это за вас.

26

Эффективная практика заключается в использовании следующих:

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

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

5

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

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.

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

1

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

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