打开文件进行读写,若不存在则创建

10 投票
4 回答
4746 浏览
提问于 2025-04-17 20:35

最优雅的打开文件的方法是什么呢?

  • 如果文件不存在,就创建一个;
  • 如果文件已经存在,就不要把里面的内容清空;
  • 可以在文件的任何位置写入内容,而不仅仅是写到最后。

根据我的了解,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

我可能错了,但我觉得如果没有多个线程,而且 tryexcept 代码块是在同一个线程里,那就不会出现竞争条件吧?(其实可以做到多个线程吗?)

这个应该可以完成这个任务。

>>>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(),这样就能从中得到一个文件对象。

撰写回答