Python os.rename() 用于父目录中多个子文件夹中的文件

标签 python xml directory rename

文件结构
我有一个名为 test_folder 的父目录,其中有几个(大约 600 个)子文件夹。每个子文件夹包含以下内容:

- 始终是 metadump.xml 文件
- .pdf.pptx.xls.docx 文件

目标
我想重命名每个文件中各自的 .pdf.pptx.xls.docx 文件我的父目录 (test_folder) 的子文件夹,基于同一子文件夹中 .xml 文件中的 title 信息,名为 banana 在下面的示例中。

import os

for root, dirs, files in os.walk("C:\\**\\Downloads\\test_folder"):
    for file in files:
        if file == 'metadump.xml':
            filename = os.path.join(root, file) 

            # READ XML FILE TO OBTAIN 'TITLE' INFORMATION
            with open(filename, 'r', encoding='utf-8') as xml_file:
                contents = xml_file.read()
                title = re.search('<dc:title rsfieldtitle="Title" rsembeddedequiv="Name" rsfieldref="8" rsfieldtype="0">(.+?)</dc:title>', contents).group(1)
                print(title) #AS A CHECK FOR SUCCESSFUL TITLE EXTRACTION

    # GOING THROUGH FILES AGAIN TO FIND NON-XML FILE
    for file in files:
        if file != 'metadump.xml':
            print(file) #CHECKING THE CORRECT FILE TO BE RENAMED IS SELECTED
            src = os.path.join(root, file) #ORIGINAL SOURCE PATH
            dst = os.path.join(root, title)#NEW DESTINATION PATH
            os.rename(src, dst) #TO RENAME FILES IN THE SUBFOLDER TO THE TITLE

运行后,我收到以下信息:
Project Alpha <-- 已从 XML 中提取正确的标题
foobar.pdf <-- 已选择子文件夹中正确的“其他”文件进行重命名

[WinError 123] 文件名、目录名或卷标语法不正确:'C:\\**\\Downloads\\test_folder\\banana\\foobar.pdf' -> 'C:\\**\\下载\\test_folder\\banana\\Project Alpha'
我不确定为什么无法使用从同一文件中的 .XML 文件中提取的“标题”重命名另一个文件 foobar.pdf子文件夹。


所需输出示例
test_folder 父目录中,在 banana 子文件夹中,我们有:
鉴于:
- foobar.pdf(通用文件名)
- metadump.xml(在此文件中,可以提取标题:Project Alpha)

结果:
- Project_Alpha.pdf (此处 pdf 名称已更改)
- metadump.xml


预先感谢您的想法!

最佳答案

你的缩进全乱了。您应该首先读取 xml,然后重命名其他文件。见下文。

import os

for root, dirs, files in os.walk(r"C:/**/Downloads/test_folder"):
    for file in files:
        if file == 'metadump.xml':
            filename = os.path.join(root, file) 

            with open(filename, 'r', encoding='utf-8') as f_xml:
                contents = f_xml.read()
                title = re.search('<dc:title rsfieldtitle="Title" rsembeddedequiv="Name" rsfieldref="8" rsfieldtype="0">(.+?)</dc:title>', contents).group(1)
                print(title) #AS A CHECK FOR SUCCESSFUL TITLE EXTRACTION

# NOW GO THROUGH YOUR FILES IN CURRENT DIRECTORY AGAIN
    for file in files:
        if file != 'metadump.xml':
            src = os.path.join(root, file)
            dst = os.path.join(root, title)
            os.rename(src, dst) #TO RENAME FILES IN THE SUBFOLDER TO THE TITLE

或者,更好的是:

import os

for root, dirs, files in os.walk(r"C:/**/Downloads/test_folder"):
    # find xml file
    xmlFile = [r for r in files if r[-3:]=='xml']
    filename = os.path.join(root, xmlFile)

    with open(filename, 'r', encoding='utf-8') as f_xml:
        contents = f_xml.read()
        title = re.search('<dc:title rsfieldtitle="Title" rsembeddedequiv="Name" rsfieldref="8" rsfieldtype="0">(.+?)</dc:title>', contents).group(1)
        print(title) #AS A CHECK FOR SUCCESSFUL TITLE EXTRACTION

# NOW RENAME FILES
[os.rename(os.path.join(root, f), os.path.join(root, title)) for f in files if f[-3:]!='xml']

我没有看到你在哪里设置文件扩展名,也许你需要 os.rename(file, title + '.jpg') 或其他东西。

关于Python os.rename() 用于父目录中多个子文件夹中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50742939/

相关文章:

python - 根据(分组)条件向 DataFrame 添加标志

python - 在 Python 中,我可以隐藏基类的成员吗?

c++ - XML 编辑/替换的好选择

python - 添加 x-www-form-urlencoded 到 post 请求

java - Android Studio : Layout hierarchy problems

android - 透明 active ,带有淡淡的灰色

javascript - 是否可以使用 XHR 上传文件目录?

macos - 将 NSOpenPanel 的默认目录更改为 "Media"目录

php - 在 Laravel 中删除包含文件的文件夹

python - 删除文本文件中包含 python 中特定单词/字符串的整行