如何循环多个子文件夹并根据特定的 XML 标签重命名文件?
Posted
技术标签:
【中文标题】如何循环多个子文件夹并根据特定的 XML 标签重命名文件?【英文标题】:How to loop over multiple sub-folders and rename files based on a specific XML tag? 【发布时间】:2019-08-23 22:53:51 【问题描述】:我正在尝试根据特定的 XML 标记重命名或替换(以更简单者为准)子文件夹中的文件名。每个子文件夹有 1 个 pdf 和 1 个 XML 文件。当前文件名都有错误的 ID#,我想用相应 XML 文件中的正确 ID 替换该 ID#。这可能吗?
Folder A(Parent folder)
Folder B(Sub folder)
1.pdf
2.xml
Folder B2(Sub folder)
1.pdf
2.xml
Folder B3(Sub folder)
1.pdf
2.xml
目前我可以遍历目录中的所有子文件夹并打印出文件名。我也有代码允许我打印出所有 ID 标签,但前提是所有 XML 文件都在 1 个子文件夹中。这没有多大帮助,因为我在每个子文件夹中有 1 个 XML 文件。
import os
import xml.etree.ElementTree as ET
import re
for dir, sub, filenames in os.walk(path):
print(dir)
sub = [n for n in sub]
contents = sub + filenames
sub.sort()
for f in contents:
print(f)
if f.endswith(".xml"):
fullname = os.path.join(path, f)
tree = ET.parse(fullname)
root = tree.getroot()
for ear in root.iter("EAR"):
sec = ear.text # gives me the full section #
# print(sec[4:11] + " THese are the section numbers")
new_fn = sec[4:11]
# print(re.sub(",", "", new_fn))
print(re.sub("[^\d\-]", "", new_fn))
从if f.endswith
开始,如果我将所有 XML 文件都放在一个文件夹中,代码就可以工作。在此当前代码中,它无法循环遍历我的所有子文件夹。我收到一条错误消息,提示 No such file or directory
。
注意: "EAR"
是我要查找的标签。
【问题讨论】:
请edit你的问题并添加一个(小)示例.xml
文件,人们可以使用它来重现问题并测试他们的解决方案(minimal reproducible example)。
谢谢我现在解决了我原来的问题。我得到它来重命名我所有的 XML 文件。
【参考方案1】:
所以我让它工作了。以下是我的做法。
for root, dirs, files in os.walk(path):
for file in files:
curr_fld = os.path.basename(root)
old_name = os.path.join(path,curr_fld,file)
# print(file)
if file.endswith(".xml"):
file_name, file_ext = os.path.splitext(file)
print(file_name)
xmldoc = minidom.parse(os.path.join(root, file))
try:
item_id = xmldoc.getElementsByTagName("EAR")[0].firstChild.nodeValue
except IndexError:
print("skipped")
try:
cfr, year, title, sec_num, txt_replace = file_name.split("-")
except ValueError:
print("someone did it wrong.")
item_id = re.sub("[^\d\-]", "", item_id)
# print(item_id)
new_name = "---".format(cfr, year, title, item_id, file_ext)
new_name2 = os.path.join(path,curr_fld,new_name)
# print(new_name)
try:
os.rename(old_name,new_name2)
except WindowsError:
continue
print("Didn't work!")
【讨论】:
以上是关于如何循环多个子文件夹并根据特定的 XML 标签重命名文件?的主要内容,如果未能解决你的问题,请参考以下文章