如何循环多个子文件夹并根据特定的 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 标签重命名文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将动态XML中的嵌套标签转换为for循环?

如何读取 XML 文件并删除一组标签

循环目录以处理多个 XML 文件

XSD:如何重新定义基本模式的标签

解析目录中的 html 文件并使用 BeautifulSoup 删除特定标签

如何获取 XML 中特定标签的列表