рекурсивный поиск с помощью pathlib - python - PullRequest
0 голосов
/ 09 января 2020

Скажите, у меня есть эти файлы

/home/user/one/two/abc.txt
/home/user/one/three/def.txt
/home/user/one/four/ghi.txt

Я пытаюсь найти ghi.txt рекурсивно, используя модуль pathlib. Я попытался:

p = '/home/user/'
f = Path(p).rglob(*i.txt)

, но единственный способ получить имя файла - использовать понимание списка:

file = [str(i) for i in f]

, которое фактически работает только один раз. Повторное выполнение приведенной выше команды возвращает пустой список.

Я решил выучить pathlib, потому что, очевидно, это то, что рекомендовано сообществом, но не так:

file = glob.glob(os.path.join(p,'**/*i.txt'),recursive=True) 

гораздо больше простой

1 Ответ

0 голосов
/ 10 января 2020

У вас уже есть решение.

Не уверен, правильно ли я прочитал требования, но я опубликовал ответ со следующими предположениями.

  • PathListPrefix - начальный путь, ниже которого Вы хотите искать все файлы. В вашем случае это может быть '/ home / user'
  • FileName - это имя файла, который вы ищете. В вашем случае это 'ghi.txt'
  • Вы не ожидаете более одного совпадения.
  • Необходимо попробовать что-то кроме модулей pathlib.

Что касается простого решения, я в этом тоже не уверен. Однако нижеприведенное решение - это то, что я мог бы подумать об использовании модуля os.

import os
PathListPrefix = '/home/user/'
FileName = 'ghi.txt'

def Search(StartingPath, FileNameToSearch):
    root, ext = os.path.splitext(StartingPath)
    FileName = os.path.split(root)[1]
    if FileName+ext == FileNameToSearch:
        return True
    return False

for root, dirs, files in os.walk(PathListPrefix):
    Path = root
    for eachfile in files:
        SearchPath = os.path.join(Path,eachfile)
        Found = Search(SearchPath, FileName)
        if Found:
            print(Path, FileName)
            break

Код определенно содержит намного больше строк, чем ваш. Так что это не так компактно, как у вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...