打开文件进行读写,若不存在则创建
最优雅的打开文件的方法是什么呢?
- 如果文件不存在,就创建一个;
- 如果文件已经存在,就不要把里面的内容清空;
- 可以在文件的任何位置写入内容,而不仅仅是写到最后。
根据我的了解,Python的open
函数似乎无法满足这些要求:它提供了不同的模式,但我试过的每一种模式都至少有一个要求不符合:
r+
模式在文件不存在时会出错。w+
模式会清空文件,导致原有内容丢失。a+
模式在我的OS X系统上,所有写入都只能在文件的末尾进行。
在打开文件之前检查文件是否存在感觉不太好,因为这样可能会出现竞争条件。而在异常处理程序中用不同的模式重试打开文件也一样。我希望能有更好的解决办法。
4 个回答
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 {}
0
我可能错了,但我觉得如果没有多个线程,而且 try
和 except
代码块是在同一个线程里,那就不会出现竞争条件吧?(其实可以做到多个线程吗?)
这个应该可以完成这个任务。
>>>try:
f=open('myfile.txt','r')
except OSError:
f=open('myfile.txt','w')
finally:
#whatever file I/O you need.
2
如果你使用的是Python 3.3或更高版本,你可以使用 x
模式(独占创建模式):
try:
f = open('/path/to/file', 'x+')
except FileExistsError:
f = open('/path/to/file', 'r+')
如果文件已经存在,它会抛出一个 FileExistsError
错误。
9
你需要使用 os.open()
来以更底层的方式打开文件,这种方式比 open()
提供的功能更强大。具体来说,你可以把 os.RDWR | os.O_CREAT
作为 flags
参数传入,这样就能实现你想要的效果。想了解更多细节,可以查看 open(2)
的手册页面。然后,你可以把返回的文件描述符(FD)传给 os.fdopen()
,这样就能从中得到一个文件对象。