Найти абсолютный путь к файлу в python, если знать последнюю часть пути и базовый каталог? - PullRequest
3 голосов
/ 30 марта 2020

Используя python, у меня есть последние части путей к существующим файлам, например:

sub_folder1/file1.txt
sub_folder2/file120.txt
sub_folder78/file99.txt

Обратите внимание, что эти пути не являются относительными путями к текущей папке, в которой я работаю, например, это pandas.read_csv('sub_folder1/file1.txt') из-за ошибки несуществующего файла. Тем не менее, я знаю, что все файлы имеют один и тот же базовый каталог base_dir, но я не знаю абсолютного пути. Это означает, что файл может быть расположен следующим образом:

base_dir/inter_folder1/sub_folder1/file1.txt

Или вот так:

base_dir/inter_folder7/inter_folder4/.../sub_folder1/file1.txt

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

absolut_path = some_func(end_path='bla/bla.txt', base_dir='BLAH')

Я думал, что pathlib может иметь решение, но не может ничего там не найти. Спасибо


Мне нужно сделать что-то вроде следующего:

for end_path in list_of_paths:
    full_path = some_func(end_path=end_path, base_dir='base_dir')
    image = cv2.imread(full_path)

Ответы [ 2 ]

2 голосов
/ 30 марта 2020

Это должно быть довольно легко реализовать из pathlib:

from pathlib import Path

def find(end_path: str, base_dir: str):
    for file in Path(base_dir).rglob("*"):
        if str(file).endswith(end_path):
            yield file

Это generator, чтобы соответствовать интерфейсу pathlib; как таковой он даст pathlib.PosixPath объектов. Он также найдет все подходящие файлы, например:

[str(f) for f in find(end_path="a.txt", base_dir="my_dir")]
# creates:
# ['my_dir/a.txt', 'my_dir/sub_dir/a.txt']

Если вы просто хотите получить первое значение, вы можете просто вернуть первый элемент:

def find_first(end_path: str, base_dir: str):
    for file in Path(base_dir).rglob("*"):
        if str(file).endswith(end_path):
            return str(file)

abs_path = find_first(end_path="a.txt", base_dir="my_dir")

Лучшая функция это улучшило бы поиск:

from pathlib import Path

def find(pattern, suffixes, base_dir):
    for file in Path(base_dir).rglob(pattern):
        if any(str(file).endswith(suffix) for suffix in suffixes):
            yield str(file)

base_dir = "base_directory"
suffixes = [
    'sub_folder1/file1.txt', 
    'sub_folder2/file120.txt', 
    'sub_folder78/file99.txt',
]

for full_path in find(pattern="*.txt", suffixes=suffix, base_dir=base_dir):
    image = cv2.imread(full_path)
1 голос
/ 30 марта 2020

Вам необходимо выполнить поиск подпапки в базовой папке, например,

import os
for dirpath, dirnames, files in os.walk(os.path.abspath(base_dir)):
    if dirpath.endswith(subfolder1):
        print(dirpath)

Вы также можете убедиться, что файл существует в этой папке, используя:

if dirpath.endswith("subfolder1") and "file1.txt" in files:
    print(dirpath)
...