Как рекурсивно получить определенные файлы и сохранить их относительные пути в словаре? - PullRequest
0 голосов
/ 03 апреля 2019

Я хочу написать скрипт на Python 3, который рекурсивно сканирует папку, находит все файлы с расширением .xml и сохраняет имя файла и относительный путь в словаре.

Структура выглядит так:

ROOT (/home/myuser/projects/myproject)
├── src/
│   └── mypythonscript.py
│
└── import/
    └── xml/
        ├── folder1/
        │   ├── filea.json
        │   ├── fileb.json
        │   └── filec.xml
        └── folder2/
            ├── filea.json
            ├── fileb.xml
            └── filec.json

Мой базовый путь определен как:

basepath = "../import/xml/"

Если я использую os.path.abspath(), я получаю неверный абсолютный путь к файлам:

/home/myuser/projects/myproject/src/filec.xml

То, что я ищу, - это извлечь путь, который выглядит примерно так:

../import/xml/folder1/filec.xml

Я пробовал это до сих пор:

for folder, subfolder, files in os.walk(basepath):
    for file in files:
        if os.path.splitext(file)[1] == ".xml":
            print(os.path.join(folder, file))

Однако, это ничего не напечатает.

Если я использую print(os.path.relpath(file, basepath)), я получаю несколько неверных путей, например:

../../src/filec.xml

Идея в том, чтобы сохранить относительные пути к файлам xml, чтобы впоследствии я мог их загрузить и проанализировать с помощью xmltodict.

Задача состоит в том, чтобы выполнить пакетный анализ файлов XML и извлечь из них определенные узлы, чтобы отправить их в другое место, где они могут редактироваться нетехническими специалистами. Как только это будет сделано, мне нужно взять отредактированные данные и поместить их обратно в файлы XML. Таким образом, мне нужен путь к этим файлам.

Я делаю что-то не так или мне следует использовать абсолютные пути?

1 Ответ

0 голосов
/ 04 апреля 2019

Это похоже на работу:

import os

basepath = "../import/xml/"
for root, dirs, files in os.walk(os.path.relpath(basepath)):
    for file in files:
        print(os.path.join(root, file))
...