У меня есть следующий код, который, как ожидается, сделает следующее:
Мотив состоит в том, что как только файл идентифицируется (который удовлетворяет префиксу), я хочу абсолютную реальную траекторию этого файла. Я попробовал использовать опцию 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.
Измените эту строку:
return(Path(libfile).resolve())
К этому:
return (Path(dirname) / libfile).resolve()
Я согласен с комментарием от dawg, что использование рекурсивного шаблона glob будет лучшим выбором здесь.
Несколько вопросов:
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()]
чтобы найти файлы в одном каталоге с префиксом, который вы ищете.
libfile
и сразу станет понятно, почему python не может найти абсолютный путь к нему. Это имя файла. В вашей файловой системе может быть 5 миллионов файлов с таким именем. Как питон должен знать, кого вы имели в виду?