打开文件的最优雅的方式是什么
open
内置似乎无法胜任这项任务:它提供了各种模式,但我尝试的每一种模式都无法满足我的至少一项要求:
r+
会失败。w+
将截断文件,丢失任何现有内容。a+
将强制所有写入到文件末尾,至少在我的 OS X 上是这样。在打开文件之前检查文件是否存在感觉很糟糕,因为它为竞争条件留下了空间。这同样适用于在异常处理程序中使用不同的模式重试打开。希望有更好的方法。
os.open()
在操作系统中比 open()
允许的级别更低的级别打开它。特别是,将 os.O_RDWR | os.O_CREAT
传递为 flags
应该可以满足您的要求。有关详细信息,请参阅 open(2)
手册页。然后您可以将返回的 FD 传递给 os.fdopen()
以从中获取文件对象。
如果您使用的是Python 3.3+,可以使用
x
模式(独占创建模式):
try:
f = open('/path/to/file', 'x+')
except FileExistsError:
f = open('/path/to/file', 'r+')
如果文件已存在,则会引发
FileExistsError
。
我可能是错的,但我不认为如果没有多个线程,并且
try
和 except
块是同一个线程,就不会有竞争条件? (实际上可以做多线程吗?)
这应该可以完成任务。
>>>try:
f=open('myfile.txt','r')
except OSError:
f=open('myfile.txt','w')
finally:
#whatever file I/O you need.
在尝试将项目作为字典转储到文件时,我遇到了类似的问题。但是,我导入了 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 {}