打开文件的最优雅方式是什么
据我所知,the open
builtin似乎没有完成任务:它提供了各种模式,但我尝试过的每一个都无法满足至少一个要求:
r+
将失败。w+
将截断文件,丢失任何现有内容。a+
将强制所有写入到文件的末尾,至少在我的OS X上。在打开文件之前检查是否存在感觉不好,因为它为竞争条件留出了空间。同样适用于在异常处理程序中使用不同模式重试open。我希望有更好的方法。
答案 0 :(得分:9)
您需要使用os.open()
在操作系统的较低级别打开它,而不是open()
允许。特别是,将os.RDWR | os.O_CREAT
作为flags
传递应该可以执行您想要的操作。有关详细信息,请参见open(2)
手册页。然后,您可以将返回的FD传递给os.fdopen()
以从中获取文件对象。
答案 1 :(得分:2)
如果您使用的是Python 3.3+,则可以使用x
模式(独占创建模式):
try:
f = open('/path/to/file', 'x+')
except FileExistsError:
f = open('/path/to/file', 'r+')
如果文件已存在,则会引发FileExistsError
。
答案 2 :(得分:0)
我可能错了,但如果没有多个线程,并且try
和except
块是同一个线程,我不认为会出现竞争条件? (实际上可以做多个线程吗?)
这应该取决于任务。
>>>try:
f=open('myfile.txt','r')
except OSError:
f=open('myfile.txt','w')
finally:
#whatever file I/O you need.
答案 3 :(得分:0)
我在尝试将项目作为字典转储到文件时遇到了类似的问题。但是,我导入了json,http://docs.python.org/2/library/json.html检查一下,可能非常有帮助。记得导入json。这将为您提供在需要时转储和加载数据的基础。在这种情况下,我倾倒并将信息加载到空字典中。当您想要使用空字典时,try和except方法非常有用。我发现“r +”最有用,因为它会读写文件。
def dump_data():
j = json.dumps(file.text, indent=4)
with open("database.txt", "w") as f:
f.write(j)
def load_data():
try:
with open("file.txt", "r+") as f:
return json.load(fp=f)
except IOError:
return {}