it-roy-ru.com

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

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

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

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

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

Ошибка ввода-вывода: нет такого файла или каталога.

529
trh178

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

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

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

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

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

32
Khorkrak

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

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

Измените «rw» на «w +»

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

26
baloo

Мой ответ:

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

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.

7
SilentGhost

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

6
Angel Poppy

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

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

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

6
user49117

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

5
Gustavo6046
'''
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()

Надеюсь, это поможет. [Я использую Python версии 3.6.2

5
Gajendra D Ambi

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

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

file = open('myfile.dat', 'a+')
file.seek(0, 0)
4
Danilo Souza Morães

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

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 сделает это за вас.

4
Mr. Me
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)
1
Ganesh Jat

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

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

0
njoshsn