os.path.isdir() возвращает false в существующую папку

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

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, он должен вернуть true, потому что внутри src также есть две папки, которые называются s1 и s2.

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

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


person DarkCeptor44    schedule 01.11.2019    source источник


Ответы (1)


Это потому, что он проверяет, является ли 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
person abhilb    schedule 01.11.2019
comment
Я пробовал pathlib, но не таким образом, из того, что я обнаружил, мне пришлось использовать Path('path/to/folder'), а затем использовать метод is_dir(), который не работал, но ваш работает, спасибо! - person DarkCeptor44; 01.11.2019