打开文件进行读/写,根据需要创建

时间:2014-03-03 08:50:48

标签: python file-io python-3.x io posix

打开文件的最优雅方式是什么

  • 如果文件不存在,则会创建该文件
  • 如果文件存在且
  • ,则不会截断该文件
  • 可以写文件的任何部分(在搜索之后),而不仅仅是结尾?

据我所知,the open builtin似乎没有完成任务:它提供了各种模式,但我尝试过的每一个都无法满足至少一个要求:

    如果文件不存在,
  • r+将失败。
  • w+将截断文件,丢失任何现有内容。
  • a+将强制所有写入到文件的末尾,至少在我的OS X上。

在打开文件之前检查是否存在感觉不好,因为它为竞争条件留出了空间。同样适用于在异常处理程序中使用不同模式重试open。我希望有更好的方法。

4 个答案:

答案 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)

我可能错了,但如果没有多个线程,并且tryexcept块是同一个线程,我不认为会出现竞争条件? (实际上可以做多个线程吗?)

这应该取决于任务。

>>>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 {}