Как проверить, существует ли файл?

Как узнать, существует ли файл или нет, без использования инструкции try ?

30 Solutions collect form web for “Как проверить, существует ли файл?”

Если причина, по которой вы проверяете, заключается в том, что вы можете сделать что-то вроде if file_exists: open_it() , безопаснее использовать попытку открыть его. Проверка, а затем раскрытие рисков удаляет или перемещает файл или что-то между ними при проверке и при попытке открыть его.

Если вы не планируете немедленно открывать файл, вы можете использовать os.path.isfile

Вернуть True если путь – это существующий обычный файл. Это следует за символическими ссылками, поэтому оба islink () и isfile () могут быть истинными для одного и того же пути.

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

если вам нужно убедиться, что это файл.

Начиная с Python 3.4, модуль pathlib предлагает объектно-ориентированный подход (backported to pathlib2 в Python 2.7):

 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() :

 if my_file.exists(): # path exists 

Вы также можете использовать resolve() в блоке try :

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

У вас есть функция os.path.exists :

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

Это возвращает True как для файлов, так и для каталогов, но вместо этого вы можете использовать

 os.path.isfile(file_name) 

проверить, является ли это файлом. Это следует за символическими ссылками.

В отличие от isfile() , exists() вернет True для каталогов.
Поэтому, в зависимости от того, хотите ли вы только простые файлы или также каталоги, вы будете использовать 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 

2017/12/22 :

Хотя почти все возможные способы были перечислены в (по крайней мере, одном из) существующих ответов (например, добавлены конкретные вещи Python 3.4 ), я попытаюсь объединить все вместе.

Примечание : каждый fragment стандартного библиотечного кода Python, который я собираюсь опубликовать, принадлежит версии 3.5.3 (котировки doc относятся к версии 3 ).

Заявление о проблемах :

  1. Проверить файл (возможно: также папка («специальный» файл)?) Существование
  2. Не используйте блоки try / except / else / finally

Возможные решения :

  1. [Python]: os.path. существует ( путь ) (также проверяйте другие члены семейства функций, такие как os.path.isfile , os.path.isdir , os.path.lexists для немного другого поведения)

     os.path.exists(path) 

    Вернуть True если путь относится к существующему пути или описателю открытого файла. Возвращает False для сломанных символических ссылок. На некоторых платформах эта функция может возвращать False если разрешение не предоставлено для выполнения os.stat () в запрошенном файле, даже если путь физически существует.

    Все хорошо, но если следовать дереву импорта:

    • os.pathposixpath.py ( ntpath.py )

      • genericpath.py , строка ~ # 20 +

         def exists(path): """Test whether a path exists. Returns False for broken symbolic links""" try: st = os.stat(path) except os.error: return False return True 

    это просто блок try/except вокруг [Python]: os. stat ( путь, *, dir_fd = None, follow_symlinks = True ) . Итак, ваш код try/except free, но ниже в рамке есть (по крайней мере) один такой блок. Это также относится к другим функциям ( включая os.path.isfile ).

    1.1. [Python]: pathlib.Path. is_file ()

    • Это лучший способ (и больше python ic) для обработки путей, но
    • Под капотом он делает то же самое ( pathlib.py , line ~ # 1330 ):

       def is_file(self): """ Whether this path is a regular file (also True for symlinks pointing to regular files). """ try: return S_ISREG(self.stat().st_mode) except OSError as e: if e.errno not in (ENOENT, ENOTDIR): raise # Path doesn't exist or is a broken symlink # (see https://bitbucket.org/pitrou/pathlib/issue/12/) return False 
  2. [Python]: с менеджерами контекста Statement . Или:

    • Создай:

       class Swallow: # Dummy example swallowed_exceptions = (FileNotFoundError,) def __enter__(self): print("Entering...") def __exit__(self, exc_type, exc_value, exc_traceback): print("Exiting:", exc_type, exc_value, exc_traceback) return exc_type in Swallow.swallowed_exceptions # only swallow FileNotFoundError (not eg TypeError - if the user passes a wrong argument like None or float or ...) 
      • И его использование – я буду реплицировать поведение isfile (обратите внимание, что это только для демонстрации целей, не пытайтесь написать такой код для производства ):

         import os import stat def isfile_seaman(path): # Dummy func result = False with Swallow(): result = stat.S_ISREG(os.stat(path).st_mode) return result 
    • Используйте [Python]: contextlib. ( * исключения ), который был специально разработан для выборочного пресечения исключений

    Но они кажутся обертками поверх try/except/else/finally блоков, как [Python]: оператор with утверждает:

    Это позволяет использовать обычную попытку … кроме … наконец, шаблоны использования, которые должны быть инкапсулированы для удобного повторного использования.

  3. Функции обхода файловой системы (и поиск результатов для соответствия элементов (ов))

    • [Python]: os. listdir ( path = ‘.’ ) (или [Python]: os. scandir ( path = ‘.’ ) на Python v 3.5 + )

      • Под капотом оба используют [man]: OPENDIR (3) / [man]: READDIR (3) / [man]: CLOSEDIR (3) ( [MSDN]: функция FindFirstFile / [MSDN]: функция FindNextFile / [MSDN] : FindClose ) – через “$ {PYTHON_SRC_DIR} /Modules/posixmodule.c”

      Использование scandir () вместо listdir () может значительно повысить производительность кода, который также нуждается в информации о типе файла или атрибуте файла, поскольку объекты os.DirEntry раскрывают эту информацию, если операционная система предоставляет ее при сканировании каталога. Все методы os.DirEntry могут выполнять системный вызов, но is_dir () и is_file () обычно требуют только системного вызова для символических ссылок; os.DirEntry.stat () всегда требует системного вызова в Unix, но требует только одного для символических ссылок в Windows.

    • [Python]: os. walk ( top, topdown = True, onerror = None, followlinks = False )
      • Он использует os.listdir ( os.scandir если доступно)
    • [Python]: glob. iglob ( pathname, recursive = False ) ( [Python]: glob. glob ( pathname, *, recursive = False ) )
      • По-видимому, это не функция перемещения (по крайней мере, в некоторых случаях), но она все еще использует os.listdir

    Поскольку эти итерации по папкам (в большинстве случаев), они неэффективны для нашей проблемы (есть исключения, такие как не подстановочные glob- бины, как указывал @ShadowRanger), поэтому я не буду настаивать на них. Не говоря уже о том, что в некоторых случаях может потребоваться обработка имени файла.

  4. [Python]: os. доступ ( путь, режим, *, dir_fd = None, effective_ids = False, follow_symlinks = True ) , поведение которого близко к os.path.exists (на самом деле оно шире, главным образом из-за 2- го аргумента)

    • пользовательские разрешения могут ограничивать файл «видимость», поскольку состояние документа:

      … проверить, имеет ли вызывающий пользователь указанный путь к пути . режим должен быть F_OK для проверки существования пути …

     os.access("/tmp", os.F_OK) 

    Поскольку я также работаю в C , я также использую этот метод, потому что под капотом он вызывает собственный API s (опять же через «$ {PYTHON_SRC_DIR} /Modules/posixmodule.c» ), но также открывает ворота для возможного пользователя ошибок , и это не как Python ic, как другие варианты. Итак, как справедливо указал @AaronHall, не используйте его, если вы не знаете, что делаете:

    • Ux : [man]: ACCESS (2) (обратите внимание на примечание о дыре безопасности, которое может использовать его использование !!!)
    • Win : [MSDN]: функция GetFileAttributes

    Примечание : вызов native API s также возможен через [Python]: ctypes – внешняя библиотека функций для Python , но в большинстве случаев это сложнее.

    ( Win specific): Поскольку msvcr * ( vcruntime * ) экспортирует семейство функций [MSDN]: _access, _waccess , вот пример:

     Python 3.5.3 (v3.5.3:1880cb95a742, Jan 16 2017, 16:02:32) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import os, ctypes >>> ctypes.CDLL("msvcrt")._waccess(u"C:\\Windows\\System32\\cmd.exe", os.F_OK) 0 >>> ctypes.CDLL("msvcrt")._waccess(u"C:\\Windows\\System32\\___cmd.exe", os.F_OK) -1 

    Примечания :

    • Хотя это не очень хорошая практика, я использую os.F_OK в вызове, но это просто для ясности (его значение равно 0 )
    • Я использую _waccess чтобы один и тот же код работал на Python3 и Python2 (несмотря на различия в unicode между ними)
    • Хотя это относится к очень конкретной области, оно не упоминалось ни в одном из предыдущих ответов

    Lnx ( Ubtu (16 x64) ), а также:

     Python 3.5.2 (default, Nov 17 2016, 17:05:23) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import os, ctypes >>> ctypes.CDLL("/lib/x86_64-linux-gnu/libc.so.6").access(b"/tmp", os.F_OK) 0 >>> ctypes.CDLL("/lib/x86_64-linux-gnu/libc.so.6").access(b"/tmp1", os.F_OK) -1 

    Примечания :

    • Вместо этого путь hardcoding libc ( “/lib/x86_64-linux-gnu/libc.so.6” ), который может (и, скорее всего, будет) изменяться в разных системах, None (или пустая строка) может быть передан в конструктор CDLL ( ctypes.CDLL(None).access(b"/tmp", os.F_OK) ). Согласно [человеку]: DLOPEN (3) :

      Если имя файла NULL, то возвращаемый дескриптор предназначен для основной программы. Когда этот параметр задан dlsym (), этот дескриптор вызывает поиск символа в основной программе, за которым следуют все общие объекты, загруженные при запуске программы, а затем все общие объекты, загруженные dlopen (), с флагом RTLD_GLOBAL .

      • Основная (текущая) программа ( python ) связана с libc , поэтому ее символы (включая access ) будут загружены
      • С этим нужно обращаться с осторожностью, поскольку доступны такие функции, как main , Py_Main и (все) другие; их вызов может иметь катастрофические последствия (по текущей программе)
      • Это также не относится к Win (но это не так уж и важно, поскольку msvcrt.dll находится в «% SystemRoot% \ System32», который по умолчанию равен % PATH% ). Я хотел еще что-то сделать и воспроизвести это поведение на Win (и отправить патч), но, как выясняется, функция [MSDN]: GetProcAddress только «видит» экспортированные символы, поэтому, если кто-то не объявляет функции в основном исполняемом файле как __declspec(dllexport) (почему на Земле обычный человек это сделал?), основная программа загружаема, но в значительной степени непригодна для использования
  5. Установите 3- й партийный модуль с возможностями файловой системы

    Скорее всего, будет опираться на один из способов выше (возможно, с небольшими настройками).
    Одним из примеров может быть (опять же, Win specific) [GitHub]: расширение Python для Windows (pywin32) , которое представляет собой оболочку Python поверх WINAPI .

    Но, поскольку это больше похоже на обходной путь, я останавливаюсь здесь.

  6. Другим (хромым) обходным решением ( gainarie ) является (как мне нравится его называют) подход sysadmin : используйте Python в качестве оболочки для выполнения команд оболочки

    • Выиграть :

       (py35x64_test) e:\Work\Dev\StackOverflow\q000082831>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" -c "import os; print(os.system('dir /b \"C:\\Windows\\System32\\cmd.exe\" > nul 2>&1'))" 0 (py35x64_test) e:\Work\Dev\StackOverflow\q000082831>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" -c "import os; print(os.system('dir /b \"C:\\Windows\\System32\\cmd.exe.notexist\" > nul 2>&1'))" 1 
    • Lnx ( Ubtu ):

       [cfati@cfati-ubtu16x64-0:~]> python3 -c "import os; print(os.system('ls \"/tmp\" > /dev/null 2>&1'))" 0 [cfati@cfati-ubtu16x64-0:~]> python3 -c "import os; print(os.system('ls \"/tmp.notexist\" > /dev/null 2>&1'))" 512 

Итог :

  • Используйте блоки 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 есть много classных вещей: удобное globbing, проверка владельца файла, упрощение соединения и т. Д. Это стоит проверить. Если вы используете более старый Python (версия 2.6 или новее), вы все равно можете установить pathlib с pip:

 # 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. Это считается лучшим стилем и позволяет избежать условий гонки.

Не верьте мне на слово. Существует большая поддержка этой теории. Вот пара:

Как проверить, существует ли файл, используя Python, без использования инструкции try?

Теперь, начиная с Python 3.4, импортируйте и создайте объект Path с именем файла и проверьте метод is_file (обратите внимание, что это возвращает True для символических ссылок, указывающих на обычные файлы):

 >>> from pathlib import Path >>> Path('/').is_file() False >>> Path('/initrd.img').is_file() True >>> Path('/doesnotexist').is_file() False 

Если вы находитесь на Python 2, вы можете заархивировать модуль pathlib из pypi, pathlib2 или иным образом проверить isfile из модуля os.path :

 >>> import os >>> os.path.isfile('/') False >>> os.path.isfile('/initrd.img') True >>> os.path.isfile('/doesnotexist') False 

Теперь приведенный выше, вероятно, лучший прагматичный прямой ответ здесь, но есть вероятность состояния гонки (в зависимости от того, что вы пытаетесь выполнить), и того факта, что базовая реализация использует try , но Python использует всюду в своих реализация.

Поскольку Python использует try везде, нет никакой причины избегать реализации, которая его использует.

Но в остальном этот ответ пытается рассмотреть эти оговорки.

Более длинный, гораздо более педантичный ответ

Доступно с Python 3.4, используйте новый объект Path в pathlib . Обратите внимание, что .exists не совсем прав, потому что каталоги не являются файлами (за исключением unix, что все – это файл).

 >>> from pathlib import Path >>> root = Path('/') >>> root.exists() True 

Поэтому нам нужно использовать is_file :

 >>> root.is_file() False 

Вот помощь по is_file :

 is_file(self) Whether this path is a regular file (also True for symlinks pointing to regular files). 

Итак, давайте получим файл, который, как нам известно, является файлом:

 >>> import tempfile >>> file = tempfile.NamedTemporaryFile() >>> filepathobj = Path(file.name) >>> filepathobj.is_file() True >>> filepathobj.exists() True 

По умолчанию NamedTemporaryFile удаляет файл при закрытии (и автоматически закрывается, когда к нему не существует никаких ссылок).

 >>> del file >>> filepathobj.exists() False >>> filepathobj.is_file() False 

Если вы вникнете в реализацию , вы увидите, что is_file использует try :

 def is_file(self): """ Whether this path is a regular file (also True for symlinks pointing to regular files). """ try: return S_ISREG(self.stat().st_mode) except OSError as e: if e.errno not in (ENOENT, ENOTDIR): raise # Path doesn't exist or is a broken symlink # (see https://bitbucket.org/pitrou/pathlib/issue/12/) return False 

Условия гонки: почему нам нравится попробовать

Нам нравится try потому что это позволяет избежать условий гонки. С помощью try вы просто try прочитать свой файл, ожидая, что он будет там, а если нет, вы поймаете исключение и выполните все, что имеет место при резервном поведении.

Если вы хотите проверить, существует ли файл перед попыткой его прочитать, и вы можете удалить его, а затем вы можете использовать несколько streamов или процессов, или другая программа знает об этом файле и может удалить его – вы рискуете шансом условие гонки, если вы проверяете его на наличие, потому что вы затем участвуете в гонках, чтобы открыть его до того, как его состояние (его существование) изменится.

Условия гонки очень сложно отладить, потому что есть очень маленькое окно, в котором они могут привести к сбою вашей программы.

Но если это ваша мотивация, вы можете получить значение инструкции try , используя диспетчер контекста suppress .

Избежать условий гонки без заявления о попытке: suppress

Python 3.4 дает нам диспетчер контекста suppress (ранее менеджер контекста ignore ), который делает семантически точно то же самое в меньшем числе строк, а также (по крайней мере поверхностно), удовлетворяя первоначальный запрос, чтобы избежать утверждения try :

 from contextlib import suppress from pathlib import Path 

Применение:

 >>> with suppress(OSError), Path('doesnotexist').open() as f: ... for line in f: ... print(line) ... >>> >>> with suppress(OSError): ... Path('doesnotexist').unlink() ... >>> 

Для более ранних Pythons вы можете свернуть свое собственное suppress , но без try будет более многословным, чем с. Я действительно считаю, что это единственный ответ, который не использует try на любом уровне Python, который может быть применен до Python 3.4, потому что вместо этого он использует диспетчер контекста:

 class suppress(object): def __init__(self, *exceptions): self.exceptions = exceptions def __enter__(self): return self def __exit__(self, exc_type, exc_value, traceback): if exc_type is not None: return issubclass(exc_type, self.exceptions) 

Возможно, проще попробовать:

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

Другие варианты, которые не соответствуют запросу «без попытки»:

ISFILE

 import os os.path.isfile(path) 

из документов :

os.path.isfile(path)

Вернуть True, если путь – это существующий обычный файл. Это следует за символическими ссылками, поэтому оба islink() и isfile() могут быть истинными для одного и того же пути.

Но если вы изучите источник этой функции, вы увидите, что на самом деле она использует инструкцию try:

 # This follows symbolic links, so both islink() and isdir() can be true # for the same path on systems that support symlinks def isfile(path): """Test whether a path is a regular file""" try: st = os.stat(path) except os.error: return False return stat.S_ISREG(st.st_mode) 
 >>> OSError is os.error True 

Все, что он делает, это использовать данный путь, чтобы увидеть, может ли он получить статистику по нему, OSError и затем проверить, является ли это файлом, если он не вызвал исключение.

Если вы намереваетесь что-то сделать с файлом, я бы предложил прямо попытаться с ним попробовать, кроме как избежать состояния гонки:

 try: with open(path) as f: f.read() except OSError: pass 

os.access

Доступно для Unix и Windows os.access , но для использования вы должны передавать флаги и не различать файлы и каталоги. Это больше используется для проверки того, имеет ли реальный вызывающий пользователь доступ в среде с повышенными привилегиями:

 import os os.access(path, os.F_OK) 

Он также страдает от тех же проблем состояния гонки, что и isfile . Из документов :

Примечание. Использование access () для проверки того, разрешено ли пользователю открывать файл, прежде чем это делать, используя open (), создает отверстие для безопасности, поскольку пользователь может использовать короткий промежуток времени между проверкой и открытием файла для его манипулирования. Предпочтительно использовать методы EAFP. Например:

 if os.access("myfile", os.R_OK): with open("myfile") as fp: return fp.read() return "some default data" 

лучше писать:

 try: fp = open("myfile") except IOError as e: if e.errno == errno.EACCES: return "some default data" # Not a permission error. raise else: with fp: return fp.read() 

Избегайте использования os.access . Это функция низкого уровня, которая имеет больше возможностей для пользовательской ошибки, чем объекты и функции более высокого уровня, рассмотренные выше.

Критика другого ответа:

Другой ответ говорит об os.access :

Лично я предпочитаю это, потому что под капотом он вызывает собственные API (через «$ {PYTHON_SRC_DIR} /Modules/posixmodule.c»), но также открывает ворота для возможных пользовательских ошибок, и это не так, как Pythonic, как другие варианты :

Этот ответ говорит, что он предпочитает непитонический, подверженный ошибкам метод, без каких-либо оснований. Похоже, пользователи поощряют использование низкоуровневых API без их понимания.

Он также создает диспетчер контекста, который, безоговорочно возвращая True , позволяет SystemExit все Исключения (включая KeyboardInterrupt и SystemExit !), SystemExit является хорошим способом скрыть ошибки.

Это, по-видимому, побуждает пользователей принимать плохую практику.

 import os #Your path here eg "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 упрощает навигацию и выполнение стандартных действий с вашей операционной системой.

Для справки также см. Как проверить, существует ли файл с использованием Python?

Если вам нужны операции высокого уровня, используйте shutil .

Тестирование файлов и папок с помощью os.path.isfile() , os.path.isdir() и os.path.exists()

Предполагая, что «путь» является допустимым путем, в этой таблице показано, что возвращается каждой функцией для файлов и папок:

введите описание изображения здесь

Вы также можете проверить, является ли файл определенным типом файла, используя os.path.splitext() чтобы получить расширение (если вы еще этого не знаете)

 >>> import os >>> path = "path to a word document" >>> os.path.isfile(path) True >>> os.path.splitext(path)[1] == ".docx" # test if the extension is .docx True 

В 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 / except и isfile() , поэтому вы должны использовать тот, который имеет смысл.

Если вы хотите прочитать файл, если он существует, выполните

 try: f = open(filepath) except IOError: print 'Oh dear.' 

Но если вы просто хотели переименовать файл, если он существует, и поэтому не нужно его открывать,

 if os.path.isfile(filepath): os.rename(filepath, filepath + '.old') 

Если вы хотите записать файл, если он не существует, выполните

 # python 2 if not os.path.isfile(filepath): f = open(filepath, 'w') # python 3, x opens for exclusive creation, failing if the file already exists try: f = open(filepath, 'wx') except IOError: print 'file already exists' 

Если вам нужна блокировка файлов, это другое дело.

Вы можете попробовать это (безопаснее):

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

Затем, в зависимости от результата, ваша программа может просто продолжать работать оттуда или вы можете закодировать ее, если хотите.

Хотя я всегда рекомендую использовать try и except statements, вот несколько возможностей для вас (мой личный фаворит использует os.access ):

  1. Попробуйте открыть файл:

    Открытие файла всегда проверяет наличие файла. Вы можете сделать функцию так:

     def File_Existence(filepath): f = open(filepath) return True 

    Если это False, это прекратит выполнение с помощью unhanded IOError или OSError в более поздних версиях Python. Чтобы поймать исключение, вам нужно использовать предложение try except. Конечно, вы всегда можете использовать инструкцию try except` (так как hsandt заставляет меня думать):

     def File_Existence(filepath): try: f = open(filepath) except IOError, OSError: # Note OSError is for later versions of Python return False return True 
  2. Use os.path.exists(path) :

    This will check the existence of what you specify. However, it checks for files and directories so beware about how you use it.

     import os.path >>> os.path.exists("this/is/a/directory") True >>> os.path.exists("this/is/a/file.txt") True >>> os.path.exists("not/a/directory") False 
  3. Use os.access(path, mode) :

    This will check whether you have access to the file. It will check for permissions. Based on the os.py documentation, typing in os.F_OK , it will check the existence of the path. However, using this will create a security hole, as someone can attack your file using the time between checking the permissions and opening the file. You should instead go directly to opening the file instead of checking its permissions. ( EAFP vs LBYP ). If you’re not going to open the file afterwards, and only checking its existence, then you can use this.

    Anyway, here:

     >>> import os >>> os.access("/is/a/file.txt", os.F_OK) True 

I should also mention that there are two ways that you will not be able to verify the existence of a file. Either the issue will be permission denied or no such file or directory . If you catch an IOError , set the IOError as e (like my first option), and then type in print(e.args) so that you can hopefully determine your issue. Я надеюсь, что это помогает! 🙂

Additionally, os.access() :

 if os.access("myfile", os.R_OK): with open("myfile") as fp: return fp.read() 

Being R_OK , W_OK , and X_OK the flags to test for permissions ( doc ).

In Python 3.4 the language provides a new module to manage files:

 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. 

If the file is for opening you could use one of the following techniques:

 >>> 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!') 

ОБНОВИТЬ

Just to avoid confusion and based on the answers I got, current answer finds either a file or a directory with the given name.

 if os.path.isfile(path_to_file): try: open(path_to_file) pass except IOError as e: print "Unable to open file" 

Raising exceptions is considered to be an acceptable, and Pythonic, approach for flow control in your program. Consider handling missing files with IOErrors. In this situation, an IOError exception will be raised if the file exists but the user does not have read permissions.

SRC: http://www.pfinn.net/python-check-if-file-exists.html

You can write Brian’s suggestion without the try: .

 from contextlib import suppress with suppress(IOError), open('filename'): process() 

suppress is part of Python 3.4. In older releases you can quickly write your own suppress:

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

Here’s a 1 line Python command for the Linux command line environment. I find this VERY HANDY since I’m not such a hot Bash guy.

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

Надеюсь, это полезно.

Adding one more slight variation which isn’t exactly reflected in the other answers.

This will handle the case of the file_path being None or empty string.

 def file_exists(file_path): if not file_path: return False elif not os.path.isfile(file_path): return False else: return True 

Adding a variant based on suggestion from Shahbaz

 def file_exists(file_path): if not file_path: return False else: return os.path.isfile(file_path) 

Adding a variant based on suggestion from Peter Wood

 def file_exists(file_path): return file_path and os.path.isfile(file_path): 

I’m the author of a package that’s been around for about 10 years, and it has a function that addresses this question directly. Basically, if you are on a non-Windows system, it uses Popen to access find . However, if you are on Windows, it replicates find with an efficient filesystem walker.

The code itself does not use a try block… except in determining the operating system and thus steering you to the “Unix”-style find or the hand-buillt find . Timing tests showed that the try was faster in determining the OS, so I did use one there (but nowhere else).

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

And the doc…

 >>> 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'] >>> 

The implementation, if you care to look, is here: https://github.com/uqfoundation/pox/blob/89f90fb308f285ca7a62eabe2c38acb87e89dad9/pox/shutils.py#L190

Check file or directory exists

You can follow these three ways:

Note1: The os.path.isfile used only for files

 import os.path os.path.isfile(filename) # True if file exists os.path.isfile(dirname) # False if directory exists 

Note2: The os.path.exists used for both files and directories

 import os.path os.path.exists(filename) # True if file exists os.path.exists(dirname) #True if directory exists 

The pathlib.Path method (included in Python 3+, installable with pip for Python 2)

 from pathlib import Path Path(filename).exists() 

Date:2017-12-04

Every possible solution has been listed in other answers.

An intuitive and arguable way to check if a file exists is the following:

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

I made an exhaustive cheatsheet for your reference:

 #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']} 

You can use the “OS” library of Python:

 >>> import os >>> os.path.exists("C:\\Users\\####\\Desktop\\test.txt") True >>> os.path.exists("C:\\Users\\####\\Desktop\\test.tx") False 

How do I check whether a file exists, without using the try statement?

In 2016, this is still arguably the easiest way to check if both a file exists and if it is a file:

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

isfile is actually just a helper method that internally uses os.stat and stat.S_ISREG(mode) underneath. This os.stat is a lower-level method that will provide you with detailed information about files, directories, sockets, buffers, and more. More about os.stat here

Note: However, this approach will not lock the file in any way and therefore your code can become vulnerable to ” time of check to time of use ” ( TOCTTOU ) bugs.

So raising exceptions is considered to be an acceptable, and Pythonic, approach for flow control in your program. And one should consider handling missing files with IOErrors, rather than if statements ( just an advice ).

 import os path = /path/to/dir root,dirs,files = os.walk(path).next() if myfile in files: print "yes it exists" 

This is helpful when checking for several files. Or you want to do a set intersection/ subtraction with an existing list.

  • Как использовать httpwebrequest для вывода изображения с сайта на локальный файл
  • Запись в начале текстового файла Java
  • Буферизованные файлы (для более быстрого доступа к диску)
  • Чтение файла UIF-8 Unicode в wstring
  • Получить тип файла в Cocoa
  • Почему я не могу использовать методы System.IO.File в controllerе MVC?
  • командный файл: список rar-файла в определенной папке и запись результата в текстовый файл
  • Скачать файл с помощью libcurl в C / C ++
  • Загрузка файла Symfony2
  • Должен ли я хранить мои изображения в базе данных или папках?
  • Использование отражения для изменения статического финального файла File.separatorChar для модульного тестирования?
  • Давайте будем гением компьютера.