Як дізнатися, чи існує каталог в Python


1135

У osмодулі в Python є спосіб знайти, чи існує каталог, щось на зразок:

>>> os.direxists(os.path.join(os.getcwd()), 'new_folder')) # in pseudocode
True/False

8
Слово попередження - відповідь з найвищим рейтингом може сприйняти умови перегонів. Ви можете os.statзамість цього виконати , щоб побачити, чи існує каталог і є той самий момент.
d33tah

1
@ d33tah У вас може бути хороший момент, але я не бачу способу використовувати os.statдля того, щоб повідомити каталог з файлу. Він піднімається, OSErrorколи шлях недійсний, незалежно від того, файл чи каталог. Також будь-який код після перевірки також сприйнятливий до перегонів.
Томаш Зато - Відновити Моніку

4
@ TomášZato: це призводить до висновку, що це безпечно просто виконувати операцію та обробляти помилки.
d33tah

2
@ David542 Я додав роз'яснення з тестами на точність для "isdir" "існує". Думаю, ви б зараз чомусь навчилися. Але це могло б осяяти нових людей.
GeoStoneMarten

Відповіді:


1727

Ви шукаєте os.path.isdir, або os.path.existsякщо вам байдуже, чи це файл, чи каталог.

Приклад:

import os
print(os.path.isdir("/home/el"))
print(os.path.exists("/home/el/myfile.txt"))

4
@syedrakib Хоча дужки можуть використовуватися для вказівки на те, що об'єкт може бути викликаний, це не корисно в Python, оскільки навіть класи можна викликати. Крім того , функції значення першого класу в Python, і ви можете використовувати їх без позначення дужки, як вexisting = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
phihag

10
Ви можете передавати функції іншим функціям, наприклад map, але в загальному випадку ви викликаєте функції з аргументами та дужками. Також у вашому прикладі є певна помилка. мабуть, ви маєте на увазі filter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib']).
hughdbrown

4
Також є, os.path.isfile(path)якщо вас цікавить лише те, чи це файл.
Микола

2
Майте на увазі, що на деяких платформах вони повертаються помилковими, якщо файл / каталог існує, але також виникає помилка дозволу на читання.
ковбасник

73

Дуже близько! os.path.isdirповертається, Trueякщо ви перейдете до імені каталогу, який наразі існує. Якщо його немає або це не каталог, він повертається False.


70

Python 3.4 вводиться в pathlibмодулі в стандартну бібліотеку, яка забезпечує орієнтований підхід об'єкта для обробки файлової системи шляхів. Для відповіді на питання можна використовувати методи is_dir()та exists()методи Pathоб’єкта:

In [1]: from pathlib import Path

In [2]: p = Path('/usr')

In [3]: p.exists()
Out[3]: True

In [4]: p.is_dir()
Out[4]: True

Шляхи (і рядки) можна з'єднати разом з /оператором:

In [5]: q = p / 'bin' / 'vim'

In [6]: q
Out[6]: PosixPath('/usr/bin/vim') 

In [7]: q.exists()
Out[7]: True

In [8]: q.is_dir()
Out[8]: False

Pathlib також доступний на Python 2.7 через модуль pathlib2 на PyPi.


Деякі пояснення були б корисні. Навіщо ти це робиш p / 'bin' / 'vim'? »
Натан

1
@frank Я трохи детальніше зупинився на другій частині відповіді.
joelostblom

34

Так, використовувати os.path.exists().


23
Це не перевіряє, що шлях є каталогом.
Кірк Штраузер

7
Гарний дзвінок. Інші вказали, що це os.path.isdirвдасться досягти.
aganders3

3
Якщо ви розумієте, що це не відповідає на запитання, чому ви не видалите відповідь?

3
@CamilStaps Це питання переглядали 354000 разів (на даний момент). Відповіді тут не тільки для ОП, вони є для кожного, хто міг би приїхати сюди з будь-якої причини. Відповідь aganders3 є актуальною, навіть якщо вона безпосередньо не вирішує проблему ОП.
Габріель

4
@Gabriel, то у відповіді слід зрозуміти, що це насправді робить.

21

Ми можемо перевірити 2 вбудовані функції

os.path.isdir("directory")

Це дасть булеву істину, вказаний каталог доступний.

os.path.exists("directoryorfile")

Це дасть значення boolead true, якщо вказаний каталог або файл доступний.

Щоб перевірити, чи шлях є каталогом;

os.path.isdir("directorypath")

дасть булеву істину, якщо шлях є каталогом


2
Це повністю виправдане, якщо відповідати старшій вершині.
Девіс Оселедець


10

Як і в:

In [3]: os.path.exists('/d/temp')
Out[3]: True

Можливо, киньте в a, os.path.isdir(...)щоб бути впевненим.


10

Просто надати os.statверсію (python 2):

import os, stat, errno
def CheckIsDir(directory):
  try:
    return stat.S_ISDIR(os.stat(directory).st_mode)
  except OSError, e:
    if e.errno == errno.ENOENT:
      return False
    raise

7

os надає вам безліч цих можливостей:

import os
os.path.isdir(dir_in) #True/False: check if this is a directory
os.listdir(dir_in)    #gets you a list of all files and directories under dir_in

listdir видасть виняток, якщо шлях введення недійсний.


5
#You can also check it get help for you

if not os.path.isdir('mydir'):
    print('new directry has been created')
    os.system('mkdir mydir')

6
python має вбудовані функції для створення каталогів, тому краще використовувати os.makedirs('mydir')замістьos.system(...)
gizzmole

9
Ви друкуєте, що "створено новий каталог", але ви цього не знаєте. Що робити, якщо у вас немає дозволів на створення каталогу? Ви б надрукували "створено новий каталог", але це неправда. Було б.
Войцех Якубас

4

Є зручний Unipathмодуль.

>>> from unipath import Path 
>>>  
>>> Path('/var/log').exists()
True
>>> Path('/var/log').isdir()
True

Інші речі, які вам можуть знадобитися:

>>> Path('/var/log/system.log').parent
Path('/var/log')
>>> Path('/var/log/system.log').ancestor(2)
Path('/var')
>>> Path('/var/log/system.log').listdir()
[Path('/var/foo'), Path('/var/bar')]
>>> (Path('/var/log') + '/system.log').isfile()
True

Ви можете встановити його за допомогою pip:

$ pip3 install unipath

Це схоже на вбудований pathlib. Різниця полягає в тому, що він розглядає кожен шлях як рядок ( Pathце підклас str), тому якщо якась функція очікує рядок, ви можете легко передати їй Pathоб'єкт без необхідності перетворювати його в рядок.

Наприклад, це чудово працює з Django та settings.py:

# settings.py
BASE_DIR = Path(__file__).ancestor(2)
STATIC_ROOT = BASE_DIR + '/tmp/static'

4

Ви також можете створити каталог, якщо його немає.

Джерело , якщо воно все ще є на SO.

===================================================== ====================

На Python ≥ 3,5 використовуйте pathlib.Path.mkdir:

from pathlib import Path
Path("/my/directory").mkdir(parents=True, exist_ok=True)

У старіших версіях Python я бачу дві відповіді з хорошими якостями, кожна з невеликим недоліком, тому я буду брати участь у цьому:

Спробуйте os.path.existsі врахуйте os.makedirsдля творіння.

import os
if not os.path.exists(directory):
    os.makedirs(directory)

Як зазначається в коментарях та інших місцях, існує умова перегонів - якщо каталог створений між дзвінками os.path.existsта os.makedirsвикликами, os.makedirsпомилка з помилкою OSError. На жаль, захоплення OSErrorта продовження ковдр не є надійним, оскільки воно ігнорує невдачу у створенні каталогу через інші фактори, такі як недостатні дозволи, повний диск тощо.

Одним із варіантів було б захопити OSErrorі вивчити вбудований код помилки (див. Чи існує міжплатформенний спосіб отримання інформації з OSError Python ):

import os, errno

try:
    os.makedirs(directory)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise

Крім того, може бути друга os.path.exists, але припустимо, що інша створила каталог після першої перевірки, потім видалила її перед другою - ми все одно могли обдурити.

Залежно від програми небезпека одночасних операцій може бути більшою чи меншою, ніж небезпека, яку становлять інші фактори, такі як дозволи на файли. Розробник повинен знати більше про конкретний додаток, що розробляється, та його очікуване середовище, перш ніж вибрати реалізацію.

Сучасні версії Python вдосконалюють цей код досить небагато, викриваючи FileExistsError(в 3.3 +) ...

try:
    os.makedirs("path/to/directory")
except FileExistsError:
    # directory already exists
    pass

... і дозволяючи викликати аргумент ключового словаos.makedirsexist_ok (в 3.2+).

os.makedirs("path/to/directory", exist_ok=True)  # succeeds even if directory exists.

0

Дві речі

  1. перевірити, чи існує каталог?
  2. якщо ні, створіть каталог (необов’язково).
import os
dirpath = "<dirpath>" # Replace the "<dirpath>" with actual directory path.

if os.path.exists(dirpath):
   print("Directory exist")
else: #this is optional if you want to create a directory if doesn't exist.
   os.mkdir(dirpath):
   print("Directory created")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.