如何递归抓取特定文件并将它们的相对路径存储在字典中?
How to grab specific files recursively and store their relative paths in a dictionary?
我想在 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 文件中。因此,我需要这些文件的路径。
我是做错了什么还是应该只使用绝对路径?
这似乎有效:
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))
我想在 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 文件中。因此,我需要这些文件的路径。
我是做错了什么还是应该只使用绝对路径?
这似乎有效:
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))