打开文件进行读/写,如果需要则创建

问题描述 投票:0回答:4

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

  • 如果文件不存在,则会创建该文件,
  • 如果文件确实存在,则不会被截断并且
  • 可以写入文件的任何部分(在查找之后),而不仅仅是结尾?

据我所知,

open
内置似乎无法胜任这项任务:它提供了各种模式,但我尝试的每一种模式都无法满足我的至少一项要求:

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

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

python file-io python-3.x io posix
4个回答
9
投票

您需要使用

os.open()
在操作系统中比
open()
允许的级别更低的级别打开它。特别是,将
os.O_RDWR | os.O_CREAT
传递为
flags
应该可以满足您的要求。有关详细信息,请参阅
open(2)
手册页。然后您可以将返回的 FD 传递给
os.fdopen()
以从中获取文件对象。     


3
投票

如果您使用的是Python 3.3+,可以使用

x
模式(独占创建模式):

try:
    f = open('/path/to/file', 'x+')
except FileExistsError:
    f = open('/path/to/file', 'r+')

如果文件已存在,则会引发

FileExistsError


0
投票

我可能是错的,但我不认为如果没有多个线程,并且

try
except
块是同一个线程,就不会有竞争条件? (实际上可以做多线程吗?)

这应该可以完成任务。

>>>try: 
      f=open('myfile.txt','r')
   except OSError:
      f=open('myfile.txt','w')
   finally:
      #whatever file I/O you need.

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 {}
© www.soinside.com 2019 - 2024. All rights reserved.