【问题标题】:Python os.rename() for files within multiple subfolders in a parent directoryPython os.rename() 用于父目录中多个子文件夹中的文件
【发布时间】:2018-11-17 11:16:37
【问题描述】:

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

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

目标
我想根据来自.xml 文件位于同一子文件夹中,在下面的示例中名为 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 foobar.pdf

[WinError 123] The filename, directory name, or volume label syntax is incorrect: 'C:\\**\\Downloads\\test_folder\\banana\\foobar.pdf' -&gt; 'C:\\**\\Downloads\\test_folder\\banana\\Project Alpha'
我不确定为什么我无法使用从同一子文件夹中的 .XML 文件中提取的“标题”重命名另一个文件 foobar.pdf


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

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


提前感谢您的想法!

【问题讨论】:

  • 如果文件 == "metadatadump.xml" (第 5 行),您只会进入代码的重命名部分,因此文件永远不会变成 .xml 文件以外的任何内容。只要首先检查 xml 文件,取消缩进第 11-15 行和代码就应该可以工作?抱歉,我没有时间测试,但这是一个好的开始。
  • 与您的问题无关,但是您拥有所有这些else: passes 有什么特别的原因吗? Python 中的 else 子句不是强制性的。如果您不需要它们,您可以简单地将它们排除在外。
  • 嗨@TD-Asker 我的想法是,我知道每个子文件夹都包含一个“metadump.xml”文件,我从中获得“标题”。之后,我尝试将子文件夹中的 OTHER 文件重命名为此“标题”,而不是“metadump.xml”文件本身。谢谢!
  • 我明白你想要做什么,我评论说为什么你的初始代码不起作用。您是否尝试过 os.rename 为您的 python 环境中的一个特定文件检查您是否具有正确的权限等?还要确保将文件从 foobar.pdf 重命名为 Project_Alpha.pdf - 看起来您可能缺少文件扩展名?

标签: python xml directory rename


【解决方案1】:

你的缩进都搞砸了。您应该首先阅读 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') 或其他东西。

【讨论】:

  • 我看到以下错误:[WinError 2] The system cannot find the file specified: 'foobar.pdf' -&gt; 'Project Alpha'。在旁注中,只想添加第二个for file in files 行需要:。谢谢!
  • 感谢您找到丢失的冒号。你的错误是有道理的。您需要添加根路径...查看编辑。
  • 关于您关于文件扩展名的注释,问题是我正在处理几种不同的可能文件类型,我想重命名它们。也许我可以使用某种形式的title.* 重命名?关于您的第一个解决方案,我看到以下内容:[WinError 123] The filename, directory name, or volume label syntax is incorrect: 'C:/**/Downloads/test_folder\\banana\\foobar.pdf' -&gt; 'Project Alpha'
  • 哦,天哪。不敢相信我做到了。您还需要指定目标文件的路径。查看修改。
  • 我相信我正在遵循您的意图。收到以下[WinError 123] The filename, directory name, or volume label syntax is incorrect: 'C:/**/Downloads/test_folder\\banana\\foobar.pdf' -&gt; 'C:/**/Downloads/test_folder\\banana\\Project Alpha'后,不知道是路径中不一致的“/ \”导致问题还是这是另一回事?
猜你喜欢
  • 2021-04-03
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多