удалить python Как проверить, существует ли файл без исключений?




15 Answers

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

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

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

os.path.isfile(file_path)

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

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

ОБНОВИТЬ

Чтобы избежать путаницы и на основании полученных ответов, текущий ответ находит либо файл, либо каталог с заданным именем.




Вы можете написать предложение Брайана без него 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



Ниже приведена 1 строка Python для среды командной строки Linux. Я нахожу это ОЧЕНЬ ХОРОШО, потому что я не такой горячий парень из Бэша.

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

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




Я являюсь автором пакета, который существует около 10 лет, и он имеет функцию, которая напрямую решает этот вопрос. В принципе, если вы находитесь в системе, отличной от Windows, она использует Popenдля доступа find. Однако, если вы находитесь в Windows, он реплицирует findэффективный ходок файловой системы.

Сам код не использует 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#L190




Дата: 2017-12-04

Все возможные решения перечислены в других ответах.

Интуитивно понятный и спорный способ проверить, существует ли файл:

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.statи stat.S_ISREG(mode)под ним. Это os.statметод более низкого уровня, который предоставит вам подробную информацию о файлах, каталогах, сокетах, буферах и т. Д. Подробнее о os.stat здесь

Примечание. Однако этот подход не будет блокировать файл каким-либо образом, поэтому ваш код может стать уязвимым для ошибок « время проверки на время использования » ( TOCTTOU ).

Таким образом, создание исключений считается приемлемым и Pythonic-подходом для управления потоком в вашей программе. И нужно рассматривать обработку отсутствующих файлов с помощью IOErrors, а не с ifинструкциями ( просто совет ).




Related


Tags

python   file   file-exists