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

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

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

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

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

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

16 ответов


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

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

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

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

a+ открывает файл для добавления и чтения. Указатель файла в конце файла, если файл существует. Файл открывается в режим append. Если файл не существует, создается новый файл для чтение и письмо. -режимы файлов 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 файловые режимы подробно.


>>> 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.


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


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

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

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

убедитесь, что вы закрываете файлы после их открытия. The with context manager сделает это за вас.


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


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

file = open('myfile.dat', 'a+')
file.seek(0, 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.


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)