如何检查文件是否存在无例外?

不使用try语句如何查看文件是否存在?

答案

如果您要检查的原因是可以执行诸如if file_exists: open_it() ,则try尝试打开它更安全。检查然后打开可能会导致文件被删除或移动,或者介于检查和尝试打开文件之间。

如果您不打算立即打开文件,则可以使用os.path.isfile

如果 path 是现有的常规文件,则返回True 。这遵循符号链接,因此,对于同一路径, islink()isfile()都可以为 true。

import os.path
os.path.isfile(fname)

如果您需要确保它是一个文件。

从 Python 3.4 开始, pathlib模块提供了一种面向对象的方法(在 Python 2.7 中pathlib2移植到pathlib2 ):

from pathlib import Path

my_file = Path("/path/to/file")
if my_file.is_file():
    # file exists

要检查目录,请执行以下操作:

if my_file.is_dir():
    # directory exists

要检查Path对象是否独立于文件或目录而exists() ,请使用exists()

if my_file.exists():
    # path exists

您还可以在try块中使用resolve(strict=True)

try:
    my_abs_path = my_file.resolve(strict=True)
except FileNotFoundError:
    # doesn't exist
else:
    # exists

您具有os.path.exists函数:

import os.path
os.path.exists(file_path)

这对于文件和目录都返回True ,但是您可以改用

os.path.isfile(file_path)

测试它是否是专门的文件。它遵循符号链接。

不像isfile() exists()将返回True的目录。
因此,取决于您只需要纯文件还是目录,您将使用isfile()isfile() exists() 。这是一个简单的 REPL 输出。

>>> print os.path.isfile("/etc/password.txt")
True
>>> print os.path.isfile("/etc")
False
>>> print os.path.isfile("/does/not/exist")
False
>>> print os.path.exists("/etc/password.txt")
True
>>> print os.path.exists("/etc")
True
>>> print os.path.exists("/does/not/exist")
False
import os.path

if os.path.isfile(filepath):

结合使用os.path.isfile()os.access()

import os
import os.path

PATH='./file.txt'

if os.path.isfile(PATH) and os.access(PATH, os.R_OK):
    print "File exists and is readable"
else:
    print "Either the file is missing or not readable"
import os
os.path.exists(path) # Returns whether the path (directory or file) exists or not
os.path.isfile(path) # Returns whether the file exists or not

尽管在(至少一个)现有答案中已经列出了几乎所有可能的方法(例如,添加了Python 3.4特定的内容),但我将尝试将所有内容组合在一起。

注意 :我要发布的每个Python标准库代码都属于3.5.3版。

问题陈述

  1. 检查文件( 可以争论 :也是文件夹(“特殊” 文件)吗?)是否存在
  2. 不要使用try / except / else / finally

可能的解决方案

这是检查文件是否存在的最简单方法。仅仅因为文件在您检查时存在并不保证在您需要打开文件时该文件就会存在。

import os
fname = "foo.txt"
if os.path.isfile(fname):
    print("file does exist at this time")
else:
    print("no such file exists at this time")

Python 3.4+具有一个面向对象的路径模块: pathlib 。使用这个新模块,您可以检查文件是否存在,如下所示:

import pathlib
p = pathlib.Path('path/to/file')
if p.is_file():  # or p.is_dir() to see if it is a directory
    # do stuff

您可以(通常应该)在打开文件时仍然使用try/except块:

try:
    with p.open() as f:
        # do awesome stuff
except OSError:
    print('Well darn.')

pathlib 模块中包含许多很酷的东西:方便的 globing,检查文件的所有者,更容易的路径连接等。值得一试。如果您使用的是旧版 Python(2.6 版或更高版本),则仍可以使用 pip 安装 pathlib:

# installs pathlib2 on older Python versions
# the original third-party module, pathlib, is no longer maintained.
pip install pathlib2

然后按如下所示导入它:

# Older Python versions
import pathlib2 as pathlib

首选 try 语句。它被认为是更好的风格,并且避免了比赛条件。

不要相信我。这个理论有很多支持。这是一对:

  • 样式: http ://allendowney.com/sd/notes/notes11.txt 的 “处理异常情况” 部分
  • 避免比赛条件