Функция Python os.walk () против команды find - PullRequest
0 голосов
/ 02 февраля 2019

Я пишу программу для обхода файловой системы, чтобы собирать информацию о файле для помещения в базу данных.Я пытаюсь выучить python после жизненного цикла сценариев оболочки и вижу проблему между тем, что возвращает возвращает, и тем, что os.walk возвращает

find THIS_PATH -print

for dirpath, dirs, files in os.walk( THIS_PATH ):
    print ( root )
    for fname in files:
        print ( os.path.join( root, fname ) )

У меня есть проблема в том, что «ОС» findвозвращает символические ссылки на каталоги, но Python find не делает, и я понятия не имею, как это сделать.Теперь я не хочу, чтобы он следовал им (т.е. followlinks=True), и это также привело бы к отличному результату от поиска.Но я хочу иметь возможность печатать записи, которые являются символическими ссылками на каталоги.

спасибо c

1 Ответ

0 голосов
/ 02 февраля 2019

Если вы хотите получить один и тот же вывод (сортировка может отличаться), вам нужно распечатать каталоги и файлы по указанному пути.find возвращает каталоги, а также ссылки (на что угодно).Минимальное изменение вашего кода будет:

print(THIS_PATH)
for dirpath, dirs, files in os.walk(THIS_PATH):
    for fname in dirs + files:  # iterate over items form both lists
        print (os.path.join(dirpath, fname))

Это может быть немного проще сделать с pathlib:

from pathlib import Path
mypath = Path(THIS_PATH)
for found_item in mypath.rglob('*'):
    print(mypath.joinpath(found_item))

Например, ясоздал следующее дерево:

.
├── d1
│   ├── d2
│   │   └── f2
│   └── f1
├── f2 -> d1/d2/f2
└── l1 -> d1

Запуск find приведет к (заметки о каталогах и ссылки на каталоги выглядят одинаково):

$ find .
.
./f2
./l1
./d1
./d1/.h
./d1/d2
./d1/d2/f2
./d1/f1

И запуск первого фрагмента с THIS_PATH='.' возвращает те же элементы (в несколько ином порядке, find по умолчанию будет иметь глубину в первую очередь, os.walk - ширину в первую очередь).Для этого pathlib примера, будьте осторожны, если THIS_PATH равен '.', так как он будет скомпрометировать ведущий ./.

...