файле - получить имя файла python
Как проверить, существует ли файл без исключений? (20)
Как узнать, существует ли файл или нет, без использования инструкции 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
прочитать свой файл, ожидая, что он будет там, а если нет, вы поймаете исключение и выполните все, что имеет место при резервном поведении.
Если вы хотите проверить, существует ли файл перед попыткой его прочитать, и вы можете удалить его, а затем вы можете использовать несколько потоков или процессов, или другая программа знает об этом файле и может удалить его - вы рискуете шансом условие гонки, если вы проверяете его на наличие, потому что вы затем участвуете в гонках, чтобы открыть его до того, как его состояние (его существование) изменится.
Условия гонки очень сложно отладить, потому что есть очень маленькое окно, в котором они могут привести к сбою вашей программы.
Но если это ваша мотивация, вы можете получить значение инструкции 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)
из docs :
os.path.isfile(path)
Вернуть True, если путь - это существующий обычный файл. Это следует за символическими ссылками, поэтому оба
islink()
иisfile()
могут быть истинными для одного и того же пути.
Но если вы изучите source этой функции, вы увидите, что на самом деле она использует инструкцию 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
. Из docs :
Примечание. Использование 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
является хорошим способом скрыть ошибки.
Это, по-видимому, побуждает пользователей принимать плохую практику.
Как проверить, существует ли файл, без использования инструкции 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
инструкциями ( просто совет ).
В 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():
...
В отличие от 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
Если причина, по которой вы проверяете, заключается в том, что вы можете сделать что-то вроде if file_exists: open_it()
, безопаснее использовать попытку открыть его. Проверка, а затем раскрытие рисков удаляет или перемещает файл или что-то между ними при проверке и при попытке открыть его.
Если вы не планируете немедленно открывать файл, вы можете использовать os.path.isfile
Вернуть
True
если путь - это существующий обычный файл. Это следует за символическими ссылками, поэтому оба islink() и os.path.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.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"
Предпочитаете утверждение try. Это считается лучшим стилем и позволяет избежать условий гонки.
Не верьте мне на слово. Существует большая поддержка этой теории. Вот пара:
- Стиль: раздел «Обработка необычных условий» http://allendowney.com/sd/notes/notes11.txt
- Избегайте условий гонки
Тестирование файлов и папок с помощью 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
Это самый простой способ проверить, существует ли файл. Просто потому, что файл существовал при проверке, не гарантирует, что он будет там, когда вам нужно его открыть.
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")
2017/12/22 :
Хотя почти все возможные способы были перечислены в (по крайней мере, одном из) существующих ответов (например, добавлены конкретные вещи Python 3.4 ), я попытаюсь объединить все вместе.
Примечание : каждый фрагмент стандартного библиотечного кода Python, который я собираюсь опубликовать, принадлежит версии 3.5.3 (котировки doc относятся к версии 3 ).
Заявление о проблемах :
- Проверить файл (возможно: также папка («специальный» файл)?) Существование
- Не используйте блоки
try
/except
/else
/finally
Возможные решения :
[Python]: os.path. существует ( путь ) (также проверяйте другие члены семейства функций, такие как
os.path.isfile
,os.path.isdir
,os.path.lexists
для немного другого поведения)os.path.exists(path)
Вернуть
True
если путь относится к существующему пути или описателю открытого файла. ВозвращаетFalse
для сломанных символических ссылок. На некоторых платформах эта функция может возвращатьFalse
если разрешение не предоставлено для выполнения os.stat() в запрошенном файле, даже если путь физически существует.Все хорошо, но если следовать дереву импорта:
os.path
- posixpath.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
вокруг os.stat() os.stat() . Итак, ваш код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
[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 e.g. 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 утверждает:Это позволяет использовать обычную try ... except ... finally шаблоны использования, которые должны быть инкапсулированы для удобного повторного использования.
Функции обхода файловой системы (и поиск результатов для соответствия элементов (ов))
[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), поэтому я не буду настаивать на них. Не говоря уже о том, что в некоторых случаях может потребоваться обработка имени файла.[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)
(почему на Земле обычный человек это сделал?), основная программа загружаема, но в значительной степени непригодна для использования
- Основная (текущая) программа ( python ) связана с libc , поэтому ее символы (включая
- пользовательские разрешения могут ограничивать файл «видимость», поскольку состояние документа:
Установите 3- й партийный модуль с возможностями файловой системы
Скорее всего, будет опираться на один из способов выше (возможно, с небольшими настройками).
Одним из примеров может быть (опять же, Win specific) [GitHub]: расширение Python для Windows (pywin32) , которое представляет собой оболочку Python поверх WINAPI .Но, поскольку это больше похоже на обходной путь, я останавливаюсь здесь.
Другим (хромым) обходным решением ( gainarie ) является (как мне нравится его называют) подход sysadmin : используйте Python в качестве оболочки для выполнения команд оболочки
Выиграть :
(py35x64_test) e:\Work\Dev\\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\\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 ):
[[email protected]:~]> python3 -c "import os; print(os.system('ls \"/tmp\" > /dev/null 2>&1'))" 0 [[email protected]:~]> python3 -c "import os; print(os.system('ls \"/tmp.notexist\" > /dev/null 2>&1'))" 512
Итог :
- Используйте блоки
try
/except
/else
/finally
, потому что они могут помешать вам выполнить ряд неприятных проблем. Контр-пример, о котором я могу думать, - это производительность: такие блоки являются дорогостоящими, поэтому старайтесь не размещать их в коде, который должен запускаться сотнями тысяч раз в секунду (но поскольку (в большинстве случаев) он включает в себя доступ к диску, это не так).
Заключительное примечание (и) :
- Я постараюсь держать его в курсе, любые предложения приветствуются, я включу что-нибудь полезное, которое придет в ответ
В 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.
Вы можете использовать библиотеку «OS» Python:
>>> import os
>>> os.path.exists("C:\\Users\\####\\Desktop\\test.txt")
True
>>> os.path.exists("C:\\Users\\####\\Desktop\\test.tx")
False
Добавление еще одной небольшой вариации, которая не совсем отражена в других ответах.
Это будет обрабатывать случай file_path
бытия None
или пустой строки.
def file_exists(file_path):
if not file_path:
return False
elif not os.path.isfile(file_path):
return False
else:
return True
Добавление варианта, основанного на предположении от Шахбаза
def file_exists(file_path):
if not file_path:
return False
else:
return os.path.isfile(file_path)
Добавление варианта, основанного на предположении от Питера Вуда
def file_exists(file_path):
return file_path and os.path.isfile(file_path):
Если файл открыт, вы можете использовать один из следующих способов:
>>> 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!')
ОБНОВИТЬ
Чтобы избежать путаницы и на основании полученных ответов, текущий ответ находит либо файл, либо каталог с заданным именем.
Дополнительно os.access()
:
if os.access("myfile", os.R_OK):
with open("myfile") as fp:
return fp.read()
Бытие R_OK
, W_OK
и X_OK
флаги для проверки разрешений ( doc ).
Если вы импортировали NumPy уже для других целей , то нет необходимости импортировать другие библиотеки , такие как pathlib
, os
, paths
и т.д.
import numpy as np
np.DataSource().exists("path/to/your/file")
Это вернет true или false, основываясь на его существовании.
Хотя я всегда рекомендую использовать try
и except
заявления, вот несколько возможностей для вас (мой личный фаворит использует os.access
):
Попробуйте открыть файл:
Открытие файла всегда проверяет наличие файла. Вы можете сделать функцию так:
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
Использование
os.path.exists(path)
:Это проверяет существование того, что вы укажете. Тем не менее, он проверяет файлы и каталоги, поэтому остерегайтесь того, как вы его используете.
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
Использование
os.access(path, mode)
:Это проверит, есть ли у вас доступ к файлу. Он будет проверять разрешения. На основе документации os.py, введя ее
os.F_OK
, она проверит наличие пути. Тем не менее, использование этого приведет к созданию дыры в безопасности, так как кто-то может атаковать ваш файл, используя время между проверкой разрешений и открытием файла. Вместо этого вы должны перейти непосредственно к открытию файла, а не проверять его разрешения. ( EAFP против LBYP ). Если вы не собираетесь открывать файл после этого и проверяете его существование, вы можете использовать его.Во всяком случае, здесь:
>>> import os >>> os.access("/is/a/file.txt", os.F_OK) True
Я также должен упомянуть, что есть два способа, которыми вы не сможете проверить наличие файла. Либо проблема будет, permission denied
либо no such file or directory
. Если вы поймаете IOError
, установите IOError as e
(как и мой первый вариант), а затем введите, print(e.args)
чтобы вы могли, надеюсь, определить вашу проблему. Я надеюсь, что это помогает! :)
Я являюсь автором пакета, который существует около 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
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
.
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