Не могу получить абсолютный путь в Python - PullRequest
1 голос
/ 12 апреля 2020

Я пытался использовать os.path.abspath (файл), а также Path.absolute (файл), чтобы получить пути к файлам .png, над которыми я работаю, которые находятся на отдельном диске из папки проекта, которая код находится внутри. Результат следующего сценария - «Папка проекта для кода / filename.png», тогда как, очевидно, мне нужен путь к папке, в которой находится .png;

for root, dirs, files in os.walk(newpath):
    for file in files:
        if not file.startswith("."):
            if file.endswith(".png"):
                number, scansize, letter = file.split("-")
                filepath = os.path.abspath(file)
                # replace weird backslash effects
                correctedpath = filepath.replace(os.sep, "/")
                newentry = [number, file, correctedpath]
                textures.append(newentry)

Я прочитал другие ответы здесь, которые, кажется, предполагают, что файл проекта для кода не может находиться в той же директории, что и папка, над которой вы работаете. Но это не тот случай. Может кто-то любезно указать, что я не получаю? Мне нужен абсолютный путь, потому что целью программы будет записать пути для файлов в текстовые файлы.

Большое спасибо

Ответы [ 3 ]

1 голос
/ 12 апреля 2020

Вы можете использовать pathlib.Path.rglob здесь, чтобы рекурсивно получить все png:

В качестве понимания списка:

from pathlib import Path
search_dir = "/path/to/search/dir"
# This creates a list of tuples with `number` and the resolved path
paths = [(p.name.split("-")[0], p.resolve()) for p in Path(search_dir).rglob("*.png")]

В качестве альтернативы, вы можете обработать их в al oop:

paths = []
for p in Path(search_dir).rglob("*.png"):
    number, scansize, letter = p.name.split("-")
    # more processing ...
    paths.append([number, p.resolve()])
0 голосов
/ 12 апреля 2020

Результат

for root, dirs, files in os.walk(newpath):

состоит в том, что файлы содержат только имена файлов без пути к каталогу. Использование только имен файлов означает, что python по умолчанию использует папку вашего проекта в качестве каталога для этих имен файлов . В вашем случае файлы находятся в newpath. Вы можете использовать os.path.join, чтобы добавить путь к найденным именам файлов.

filepath = os.path.join(newpath, file)

Если вы хотите найти файлы png в подкаталогах, проще всего использовать glob:

import glob

newpath = r'D:\Images'


file_paths = glob.glob(newpath + "/**/*.png", recursive=True)

for file_path in file_paths:
    print(file_path)
0 голосов
/ 12 апреля 2020

Я только недавно написал что-то вроде того, что вы ищете.

Этот код основан на предположении, что ваши файлы - это конец пути. Нельзя найти каталог или что-то в этом роде.

нет необходимости во вложенном l oop.


DIR = "your/full/path/to/direcetory/containing/desired/files"

def get_file_path(name, template):
    """
    @:param template:  file's template (txt,html...)
    @return: The path to the given file.
    @rtype: str
    """
    substring = f'{name}.{template}'
    for path in os.listdir(DIR):
        full_path = os.path.join(DIR, path)
        if full_path.endswith(substring):
            return full_path
...