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


660

如果文件以读/写方式打开,或者以不存在的方式创建,然后以读/写方式打开,最好的方法是什么?根据我的阅读,file = open('myfile.dat', 'rw')应该这样做吗?

它对我不起作用(Python 2.6.2),我想知道这是否是版本问题,或者不应该那样工作或做什么。

最重要的是,我只需要解决这个问题。我对其他东西很好奇,但是我所需要的只是做开始部分的好方法。

封闭目录可由用户和组而非其他用户(我在Linux系统上...因此权限775)可写,确切的错误是:

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


2
正如S.Mark所说,这应该“有效”。封闭目录是否可写?
拉基斯2010年

10
“这对我不起作用”吗?具体来说是什么意思?请提供实际的错误消息。
S.Lott 2010年

5
muksie的回答在下面起作用了(对于这个问题,baloo也是这样),但是为了完整起见,封闭目录是可由用户和组而不是其他人(在linux系统上……所以就是775权限)可写的,并且确切错误是IOError:没有这样的文件或目录。谢谢你们的帮助。
trh178 2010年

@ S.Lott:完成。对于那个很抱歉。
trh178 2010年

确保所有领先的文件夹file存在。
Jason Goal

Answers:


804

您应该使用open以下w+模式:

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

109
w截断现有文件。docs:Modes 'r+''w+'然后'a+'打开文件进行更新(请注意会'w+'截断文件)。
SilentGhost 2010年

4
这成功了。谢谢。我现在因为不读规范而像个白痴。我不认为“ rw”在那里还可以接受。我一定在想别的事情。
trh178 2010年

72
请注意,如果a +不存在,它将创建一个文件,并且至关重要的是,将文件搜索到末尾。因此,如果您以这种方式打开后立即进行读取,将一无所获。您需要首先从头开始:f.seek(0)
Nick Zalutskiy 2012年


120
这不是解决方案。该问题是目录。脚本缺少在该目录中创建文件的权限,或者该目录根本不存在。open('myfile.dat', 'w')然后就足够了。
Daniel F

137

以下方法的优点是,即使在途中引发了异常,文件也会在块的末尾正确关闭。它等效于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”之一-请参阅Stack Overflow问题Python文件模式详细信息


1
我将open(filename,'a +')作为myfile尝试使用此方法,并得到IOError:[Errno 2]没有这样的文件或目录:-为什么不创建文件?
洛雷塔

@Loretta您检查了值filename吗?
2015年

是的,我做到了。它是一个unicode字符串。我还尝试将open('{}。txt'.format(filename),'a +')作为myfile:
Loretta

我没有使用路径。我尝试过open('test.txt','a +')时,出现以下异常'TypeError:强制转换为Unicode:需要字符串或缓冲区,找到了文件',如果os.stat(myfile).st_size == 0:
洛雷塔

您需要正确定义编码才能正常工作。stackoverflow.com/q/728891/3701431
Sergiy Kolodyazhnyy

31

好的做法是使用以下方法:

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

18
在打开文件之前测试它是不好的,因为它可能导致争用情况(文件在打开之前被删除)。竞争条件有时可以用来开发系统中的漏洞。“ a +”模式是打开文件的最佳方法:它创建一个新文件,并追加到现有文件中。不要忘记将其包装在try / except中。
sleblanc

计算模式写或追加没有兴趣。如果文件不存在,则以附加模式创建它。
让·弗朗索瓦·法布尔


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

r +表示读/写



38
更糟糕的是,此代码很容易出现竞争状况。因此,在检查文件是否存在之后,该过程可能会中断,并且另一个进程可以创建此文件。
antibus 2014年

您还需要“ w +”标志,以便两个文件都处于读取和写入模式。
马特

14

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

2
touch使用时会更新最后修改的时间。
David Parks

@DavidParks的好处,只是测试了一下,在ext4文件系统和python3.7.2上的确如此。我不认为这是预期的或预期的行为,也许是与python有关的错误?
Granitosaurus

3
touch在Linux的命令行中使用时也是如此,因此我认为这是预期的行为。
大卫·帕克斯

11

我的答案:

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

9
'''
w  write mode
r  read mode
a  append mode

w+  create file if it doesn't exist and open it in write mode
r+  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 mode
f.write('python rules')
f.close()

我希望这有帮助。[仅供参考,请使用python 3.6.2版]


6

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


6

采用:

import os

f_loc = r"C:\Users\Russell\Desktop\myfile.dat"

# Create the file if it does not exist
if not os.path.exists(f_loc):
    open(f_loc, 'w').close()

# Open the file for appending and reading
with open(f_loc, 'a+') as f:
    #Do stuff

注意:打开文件后必须将其关闭,with上下文管理器是让Python为您解决此问题的一种好方法。


6

您想对文件做什么?只写它还是读和写?

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

如果需要读取文件,则在打开文件之前必须先将其存在。您可以在打开它之前测试它的存在或使用try / except。


5
在开放之前测试是否存在可能会引入竞争条件。在这种情况下,可能没什么大不了的,但要记住一点。
Daniel Hepper 2010年

1
“如果需要从文件中读取文件,则在打开文件之前必须先将该文件存在。” 谢谢您保存我的理智。
Brian Peterson

5

我认为r+不是rw。我只是一个入门者,这就是我在文档中看到的内容。


4

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


1

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

通过使用鲜为人知的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。


1

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

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

0

也许这会有所帮助

首先将os模块导入py文件

import os

然后创建一个名为save_file的变量并将其设置为您要制作html或txt的文件,在这种情况下,将其设置为txt文件

save_file = "history.txt"

然后定义一个函数,该函数将使用os.path.is file方法检查文件是否存在,如果不存在,它将创建一个文件

def check_into():
if os.path.isfile(save_file):
    print("history file exists..... \nusing for writting....")
else:
    print("history file not exists..... \ncreating it..... ")
    file = open(save_file, 'w')
    time.sleep(2)
    print('file created ')
    file.close()

最后调用函数

check_into()

-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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.