Python中的open()如果文件不存在,则不会创建文件

如果文件存在,以读/写方式打开文件的最佳方法是什么,或者如果不存在,则创建它并以读/写方式打开它?从我读到的内容来看,file = open('myfile.dat', 'rw')应该这样做,对吧?

它不适合我(Python 2.6.2),我想知道它是否是一个版本问题,或者不应该像那样工作。

最重要的是,我只需要一个解决问题的方法。我对其他东西很好奇,但我所需要的只是一个很好的方法来完成开头部分。

封闭目录可由用户和组写入,而不是其他(我在Linux系统上……换句话说,权限775),确切的错误是:

IOError:没有这样的文件或目录。

1192684 次浏览

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

将“rw”改为“w+”

或使用'a+'附加(不擦除现有内容)

您应该将openw+模式一起使用:

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

r+表示读/写

你想对文件做什么?只写入它还是既读又写?

'w''a'将允许写入,如果文件不存在,将创建文件。

如果您需要从文件中读取,则在打开它之前该文件必须存在。您可以在打开它之前测试它的存在或使用try/除了。

以下方法的优点是文件在块的末尾是适当关闭,即使在途中引发了异常。它等效于try-finally,但要短得多。

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

a+打开一个文件进行附加和读取。文件指针是如果文件存在,则在文件末尾。该文件在附加模式。如果文件不存在,它会为阅读和写作。-python文件模式

寻求()方法设置文件的当前位置。

f.seek(pos [, (0|1|2)])pos .. position of the r/w pointer[] .. optionally() .. one of ->0 .. absolute position1 .. relative position to current2 .. relative position from end

只允许使用“rwab+”字符;必须只有一个“rwa”-请参阅Stack Overflow问题Python文件模式详细信息

我认为这是0,不是1。我只是一个初学者,这就是我在留档中看到的。

我的回答:

file_path = 'myfile.dat'try:fp = open(file_path)except IOError:# If not exists, create the filefp = open(file_path, 'w+')

用途:

import os
f_loc = r"C:\Users\Russell\Desktop\myfile.dat"
# Create the file if it does not existif not os.path.exists(f_loc):open(f_loc, 'w').close()
# Open the file for appending and readingwith open(f_loc, 'a+') as f:#Do stuff

注意:文件在打开后必须关闭,上下文管理器是让Python为您处理此问题的好方法。

良好的做法是使用以下内容:

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

将w+用于写入文件,如果存在则截断,r+用于读取文件,如果不存在则创建一个但不写入(并返回null)或+用于创建新文件或附加到现有文件。

因此,您想将数据写入文件,但前提是它不存在?

这个问题很容易通过使用鲜为人知的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。

'''w  write moder  read modea  append mode
w+  create file if it doesn't exist and open it in write moder+  open for reading and writing. Does not create file.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 modef.write('python rules')f.close()

[仅供参考,我使用的是Python版本3.6.2]

如果你想打开它进行读写,我假设你不想在打开它时截断它,你希望能够在打开它后立即读取文件。所以这是我使用的解决方案:

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

从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 nothingfile = open(filename)

与目录相同:

filename.mkdir(parents=True, exist_ok=True)
import os, platformos.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)

对于Python 3+,我会做:

import os
os.makedirs('path/to/the/directory', exist_ok=True)
with open('path/to/the/directory/filename', 'w') as f:f.write(...)

所以,问题是with open无法在目标目录存在之前创建文件。我们需要创建它,然后在这种情况下w模式就足够了。