本帖最后由 sjjy1813 于 2023-2-28 19:45 编辑
我自己也研究了一下import os
import re
from docx import Document
from docx.opc.exceptions import PackageNotFoundError
# 定义正则表达式匹配规则,匹配文件名中的非法字符
invalid_pattern = re.compile(r'[\/\\\:\*\?"\<\>\|]')
# 定义函数,将文件名中的非法字符替换为'_'
def replace_invalid_char(filename):
return invalid_pattern.sub('_', filename)
# 定义递归函数,遍历指定路径下所有的文件夹及子文件夹
def traverse_folder(path):
for root, dirs, files in os.walk(path):
for filename in files:
if filename.endswith('.doc') or filename.endswith('.docx'):
filepath = os.path.join(root, filename)
try:
doc = Document(filepath)
# 获取第一段的文字
text = doc.paragraphs[0].text.strip()
# 去除文件名中的非法字符
new_name = replace_invalid_char(text)
# 如果文件名已存在,则在重复的文件名后面添加数字
if os.path.exists(os.path.join(root, new_name + os.path.splitext(filename)[1])):
i = 1
while True:
new_name_with_number = f'{new_name} ({i})'
if not os.path.exists(os.path.join(root, new_name_with_number + os.path.splitext(filename)[1])):
new_name = new_name_with_number
break
i += 1
# 重命名文件
os.rename(filepath, os.path.join(root, new_name + os.path.splitext(filename)[1]))
# 打印文件名的修改过程
print(f'{filename} -> {new_name + os.path.splitext(filename)[1]}')
except (PackageNotFoundError, IndexError):
# 如果文件不是有效的doc或docx文件,则跳过该文件
continue
for folder in dirs:
traverse_folder(os.path.join(root, folder))
# 指定文件夹路径
folder_path = 'C:\\文件\\2023'
# 打印提示信息
print(f'正在遍历路径 {folder_path} 下的所有文件夹及子文件夹')
# 调用递归函数,遍历指定路径下所有的文件夹及子文件夹
traverse_folder(folder_path)
# 打印结束信息
print('文件名修改完成!')
|