Python,如果存在则打开写入,否则会引发错误

时间:2015-05-29 16:45:43

标签: python file error-handling

是否有一个选项我可以传递open(),在尝试编写不存在的文件时会导致IOerror?我正在使用python通过符号链接读取和写入块设备,如果链接丢失,我想引发错误而不是创建常规文件。我知道我可以添加一个检查以查看该文件是否存在并手动引发错误,但是如果它存在则更愿意使用内置的东西。

当前代码如下所示:

device = open(device_path, 'wb', 0)
device.write(data)
device.close()

4 个答案:

答案 0 :(得分:2)

使用os.path.islink()os.path.isfile()检查文件是否存在。

答案 1 :(得分:2)

每次进行检查都很麻烦,但您始终可以包裹open()

import os

def open_if_exists(*args, **kwargs):
    if not os.path.exists(args[0]):
        raise IOError('{:s} does not exist.'.format(args[0]))
    f = open(*args, **kwargs)
    return f

f = open_if_exists(r'file_does_not_exist.txt', 'w+')

这只是快速而肮脏的,所以不允许使用:with open_if_exists(...)

更新

缺乏上下文管理器困扰着我,所以这里有:

import os
from contextlib import contextmanager

@contextmanager
def open_if_exists(*args, **kwargs):
    if not os.path.exists(args[0]):
        raise IOError('{:s} does not exist.'.format(args[0]))
    f = open(*args, **kwargs)
    try:
        yield f
    finally:
        f.close()

with open_if_exists(r'file_does_not_exist.txt', 'w+') as f:
    print('foo', file=f)

答案 2 :(得分:1)

我担心您无法使用open()功能执行文件存在检查并引发错误。

下面是python中open()的签名,其中name是file_name,mode是访问模式,buffering表示访问时是否要执行缓冲一份文件。

  

open(name [,mode [,buffering]])

相反,您可以检查文件是否存在。

>>> import os
>>> os.path.isfile(file_name)

这将返回TrueFalse,具体取决于文件是否存在。要专门测试文件,可以使用它。

要测试文件和目录是否存在,您可以使用:

>>> os.path.exists(file_path)

答案 3 :(得分:1)

是。

open(path, 'r+b')

指定" r"选项意味着文件必须存在,您可以阅读。 指定" +"意味着你可以写,并且你将在最后定位。 https://docs.python.org/3/library/functions.html?#open