|

楼主 |
发表于 2023-2-28 19:43:59
|
显示全部楼层
本帖最后由 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('文件名修改完成!')
复制代码 |
|