文件结构
我有一个名为 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/