检查文件是否存在的Pythonic方法?
检查一个文件是否存在的最佳方法是什么?如果文件不存在,怎么创建它?
5 个回答
42
我觉得这里的其他回答(到目前为止)都没有解决他们提出的方案中可能出现的竞争条件问题。
任何代码如果先检查文件是否存在,然后在程序的几行后再创建这个文件,就有可能在你不注意的时候文件已经被创建了,这样会给你带来麻烦(或者给“那个其他文件”的拥有者带来麻烦)。
如果你想避免这种情况,我建议你可以试试下面的代码(未经测试):
import os
def open_if_not_exists(filename):
try:
fd = os.open(filename, os.O_CREAT | os.O_EXCL | os.O_WRONLY)
except OSError, e:
if e.errno == 17:
print e
return None
else:
raise
else:
return os.fdopen(fd, 'w')
这段代码应该会在文件不存在时打开文件进行写入,并返回一个文件对象。如果文件已经存在,它会打印“哎呀”并返回None(这段代码未经测试,仅仅是根据Python文档的内容,所以可能不是100%正确)。
95
与其他人建议的使用 os.path.isfile
不同,我建议使用 os.path.exists
,因为它可以检查任何名称的文件,而不仅仅是普通文件。
所以:
if not os.path.exists(filename):
file(filename, 'w').close()
另外一种方法是:
file(filename, 'w+').close()
后者会在文件存在时创建文件,但如果文件不存在就不会创建。不过,如果文件存在但你没有写入权限,它会失败。这就是我更喜欢第一种方法的原因。
321
要检查一个路径是否是一个存在的文件,可以使用:
如果这个路径是一个存在的普通文件,就会返回
True
。这个方法会跟随符号链接,所以对于同一个路径,islink()
和isfile()
都有可能返回真。