os.path.isdir () возвращает false в существующую папку - PullRequest
0 голосов
/ 01 ноября 2019

Я прочитал этот другой пост, но ни одно из решений там не сработало, скажем, у меня есть такая структура папок:

main.py
src\
  s1\
    dummy.txt
  s2\
    dummy.txt

И этот код:

import os

for filename in os.listdir('.'):
    isdir=os.path.isdir(filename)
    print('%s : %s'%(filename,isdir))

Когда я запускаю его с . в качестве параметра listdir(), он работает, он показывает src : True и main.py : False, что правильно, потому что есть папка с именем src, но когда я пытаюсь запустить его с srcв качестве параметра это вывод, который я получаю: s2 : False и s1 : False, он должен возвращать истину, потому что в src также есть две папки, которые называются s1 и s2.

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

Я создал этот Repl, чтобы показать, что именно происходит.

1 Ответ

1 голос
/ 01 ноября 2019

Это потому, что он проверяет, является ли s1 каталогом в текущем рабочем каталоге.

>>> for x in os.listdir('src'):
...     print(f'Does {os.path.abspath(x)} exists? {os.path.exists(os.path.abspath(x))}')
...
Does d:\SO\tmp\s1 exists? False

Поэтому я бы предложил вместо этого использовать scandir.

>>> with os.scandir('src') as it:
...     for entry in it:
...             print(f"{entry} is directory? {os.path.isdir(entry)}")
...
<DirEntry 's1'> is directory? True

Еще лучше, если вы используете модуль pathlib для файлов, связанных с файловой системой.

>>> from pathlib import Path
>>> entries = Path.cwd().glob("**/*")
>>> for entry in entries:
...     print(f"{entry} is a directory ? {entry.is_dir()}")
...
d:\SO\tmp\src is a directory ? True
d:\SO\tmp\src\s1 is a directory ? True
...