Нахождение реального пути файла в Unix

1

У меня есть следующий код, который, как ожидается, сделает следующее:

  • В качестве входа в функцию предоставляется имя каталога (dirName) и префикс.
  • Выводит все содержимое на один уровень из предоставленного входного каталога (dirName) и начинает заполнять данные файла в подкаталогах с помощью функции os.walk.
  • После обнаружения файлов они проверяются на определенный префикс и обрабатываются дополнительно.
  • Мотив состоит в том, что как только файл идентифицируется (который удовлетворяет префиксу), я хочу абсолютную реальную траекторию этого файла. Я попробовал использовать опцию Path (libfile).resolve(), но это дало только настоящий рабочий каталог, из которого сценарий запускается в противоположность реальной траектории этого файла. Не могли бы вы объяснить, где я ошибаюсь?

    import os
    from pathlib import Path
    
    def directory(dirName, prefix):
    
    process_dir = [name for name in os.listdir(dirName) if os.path.isdir(os.path.join(dirName, name))]
    for entry in process_dir:
        for dirname, directory, files in os.walk(os.path.join(dirName, entry)):
            for libfile in files:
                if libfile.startswith((prefix)):
                    return(Path(libfile).resolve())
    

Версия Python 3.6.2.

  • 0
    Я использую Python 3.6.2
  • 0
    Посмотрите на значение libfile и сразу станет понятно, почему python не может найти абсолютный путь к нему. Это имя файла. В вашей файловой системе может быть 5 миллионов файлов с таким именем. Как питон должен знать, кого вы имели в виду?
Показать ещё 6 комментариев
Теги:
python-3.x
pathlib

2 ответа

1
Лучший ответ

Измените эту строку:

return(Path(libfile).resolve())

К этому:

return (Path(dirname) / libfile).resolve()

Я согласен с комментарием от dawg, что использование рекурсивного шаблона glob будет лучшим выбором здесь.

  • 0
    Большое спасибо за все комментарии / предложения и помощь. Это решило мою проблему. Для любопытства кто-нибудь может также перечислить решение с глобусом, которое было предложено Даугом?
2

Несколько вопросов:

1) Вы возвращаете только один файл

2) Вы вызываете .resolve только с именем файла, поэтому, когда путь будет разрешен, зависит от текущего рабочего каталога.

3) В вашей спецификации указано, что вы хотите только спуститься на один уровень в дереве каталогов, но вы не os.walk путь спуска, который os.walk.

Я предлагаю os.walk и полностью использовать Path.

Вы заявляете, что хотите только файлы с одного уровня вниз; это означает, что вам нужно пройти этот уровень с помощью Path:

file_names=[]
for d in (p for p in Path(dirName).glob('*') if p.is_dir()):
    ab_path=d.resolve()
    file_names+=[fn for fn in Path(ab_path).iterdir() if fn.is_file() and fn.name.startswith(prefix)]

return file_names

Также возможно построить шаблон глобуса, который упростит это в дальнейшем. Это может быть так просто:

Path(dirName).glob('*/prefix*')

Или же,

[p.resolve() for p in Path(dirName).glob('*/prefix*') if p.is_file()]

чтобы найти файлы в одном каталоге с префиксом, который вы ищете.

  • 0
    Еще раз спасибо за все детали. Теперь ясно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню