file python找檔案 python路徑處理 - 如何檢查文件是否存在而沒有例外?




15 Answers

你有os.path.exists函數:

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

這會為文件和目錄返回True ,但您可以改為使用

os.path.isfile(file_path)

測試它是否是一個特定的文件。 它遵循符號鏈接。

python檔案 python資料夾 python建立資料夾

如何在不使用try語句的情況下查看文件是否存在?




import os.path

if os.path.isfile(filepath):



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



這是檢查文件是否存在的最簡單方法。 只是因為您檢查時文件存在並不能保證在您需要打開它時它就在那裡。

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")



喜歡try語句。 它被認為是更好的風格,避免了競爭條件。

不要相信我的話。 這個理論有很多支持。 這是一對夫婦:




import os
#Your path here e.g. "C:\Program Files\text.txt"
#For access purposes: "C:\\Program Files\\text.txt"
if os.path.exists("C:\..."):   
    print "File found!"
else:
    print "File not found!"

導入os可以更輕鬆地使用您的操作系統進行導航和執行標準操作。

有關參考,請參閱share

如果需要高級操作,請使用shutil




2016年最好的方法仍然是使用os.path.isfile

>>> os.path.isfile('/path/to/some/file.txt')

或者在Python 3中,您可以使用pathlib

import pathlib
path = pathlib.Path('/path/to/some/file.txt')
if path.is_file():
    ...



你可以試試這個(更安全):

try:
    # http://effbot.org/zone/python-with-statement.htm
    # 'with' is safer to open a file
    with open('whatever.txt') as fh:
        # Do something with 'fh'
except IOError as e:
    print("({})".format(e))

輸出將是:

([Errno 2]沒有這樣的文件或目錄:'whatever.txt')

然後,根據結果,您的程序可以從那裡繼續運行,或者如果需要,您可以編寫代碼來停止它。




在Python 3.4中,該語言提供了一個管理文件的新模塊:

import pathlib
path = pathlib.Path('path/to/file')
if path.is_file(): # If you want to check a directory: path.is_dir()
    # If it is true, return true on your code.



如果文件用於打開,您可以使用以下技術之一:

>>> with open('somefile', 'xt') as f: #Using the x-flag, Python3.3 and above
...     f.write('Hello\n')

>>> if not os.path.exists('somefile'): 
...     with open('somefile', 'wt') as f:
...         f.write("Hello\n")
... else:
...     print('File already exists!')

UPDATE

為了避免混淆並根據我得到的答案,當前答案找到一個文件具有給定名稱的目錄。




沒有這個,你可以寫Brian的建議try:

from contextlib import suppress

with suppress(IOError), open('filename'):
    process()

suppress是Python 3.4的一部分。在舊版本中,您可以快速編寫自己的抑制:

from contextlib import contextmanager

@contextmanager
def suppress(*exceptions):
    try:
        yield
    except exceptions:
        pass



這是Linux命令行環境的1行Python命令。我發現這非常好,因為我不是那麼熱的Bash傢伙。

python -c "import os.path; print os.path.isfile('/path_to/file.xxx')"

我希望這是有幫助的。




我是一個已經存在了大約10年的軟件包的作者,它有一個直接解決這個問題的功能。基本上,如果您使用的是非Windows系統,則用於Popen訪問find。但是,如果您使用的是Windows,則會find使用高效的文件系統walker進行複制。

代碼本身不使用try塊...除了確定操作系統,從而引導您進入“Unix”風格find或手動風格find。時間測試表明,try確定操作系統的速度更快,所以我確實在那裡使用了一個(但沒有其他地方)。

>>> import pox
>>> pox.find('*python*', type='file', root=pox.homedir(), recurse=False)
['/Users/mmckerns/.python']

而且文件......

>>> print pox.find.__doc__
find(patterns[,root,recurse,type]); Get path to a file or directory

    patterns: name or partial name string of items to search for
    root: path string of top-level directory to search
    recurse: if True, recurse down from root directory
    type: item filter; one of {None, file, dir, link, socket, block, char}
    verbose: if True, be a little verbose about the search

    On some OS, recursion can be specified by recursion depth (an integer).
    patterns can be specified with basic pattern matching. Additionally,
    multiple patterns can be specified by splitting patterns with a ';'
    For example:
        >>> find('pox*', root='..')
        ['/Users/foo/pox/pox', '/Users/foo/pox/scripts/pox_launcher.py']

        >>> find('*shutils*;*init*')
        ['/Users/foo/pox/pox/shutils.py', '/Users/foo/pox/pox/__init__.py']

>>>

如果你願意,可以在這裡實現:https://github.com/uqfoundation/pox/blob/89f90fb308f285ca7a62eabe2c38acb87e89dad9/pox/shutils.py#L190https://github.com/uqfoundation/pox/blob/89f90fb308f285ca7a62eabe2c38acb87e89dad9/pox/shutils.py#L190




日期:2017年12月4日

其他答案中列出了每種可能的解決方案。

檢查文件是否存在的直觀且有爭議的方法如下:

import os
os.path.isfile('~/file.md')    # Returns True if exists, else False
additionaly check a dir
os.path.isdir('~/folder') # Returns True if the folder exists, else False
check either a dir or a file
os.path.exists('~/file')

我做了一個詳盡的備忘單供你參考:

#os.path methods in exhaustive cheatsheet
{'definition': ['dirname',
               'basename',
               'abspath',
               'relpath',
               'commonpath',
               'normpath',
               'realpath'],
'operation': ['split', 'splitdrive', 'splitext',
               'join', 'normcase'],
'compare': ['samefile', 'sameopenfile', 'samestat'],
'condition': ['isdir',
              'isfile',
              'exists',
              'lexists'
              'islink',
              'isabs',
              'ismount',],
 'expand': ['expanduser',
            'expandvars'],
 'stat': ['getatime', 'getctime', 'getmtime',
          'getsize']}



如何在不使用try語句的情況下檢查文件是否存在?

在2016年,這仍然是檢查文件是否存在以及文件是否是文件的最簡單方法:

import os
os.path.isfile('./file.txt')    # Returns True if exists, else False

isfile實際上只是一個內部使用os.statstat.S_ISREG(mode)下面的輔助方法。這os.stat是一個較低級別的方法,它將為您提供有關文件,目錄,套接字,緩衝區等的詳細信息。更多關於os.stat的信息

注意:但是,此方法不會以任何方式鎖定文件,因此您的代碼可能容易受到“ 檢查使用時間 ”(TOCTTOU)錯誤的影響。

因此,提高異常被認為是一種可接受的Pythonic方法,用於程序中的流量控制。並且應該考慮使用IOErrors處理丟失的文件,而不是if語句(只是一個建議)。




Related