将文件夹的PDF 复制到另一个文件夹并且排序!
解决的问题
将一个文件夹的PDF,打开以后将日期提取出来。例如:2026年07月16日。提取这个日期,并且将其转为2026.07-16.重新命名!
代码内容
import re
import os
import shutil # 复制文件专用的 类库
import pymupdf
def extract_info(filepath,filename):
m = re.match(r'dzfp_(\d+)_(.+?)_(\d{14})\.pdf', filename)
if not m:
return None,None,None
# invoice_no == 发票 | company == 公司名称
invoice_no = m.group(1)
company = m.group(2)
# ↓↓↓ 用 PyMuPDF 打开PDF,读取第一页全部文本
try:
doc = pymupdf.open(filepath)
text = doc[0].get_text()
doc.close()
except:
return None,invoice_no,company
# 提取PDF的日期 2026年7月24日
m2 = re.search(r'(\d{4})年(\d{1,2}月(\d{1,2})日)', text)
if m2:
y = m2.group(1)
mo = m2.group(2).zfill(2)
d = m2.group(3).zfill(2)
return f'{y}年{mo}月{d}日',invoice_no,company
return None, invoice_no, company
def main():
input_dir = r"C:\Users\A\Desktop\映山红\发票"
# 重命名后存到到 ↓↓↓ 下面的文件夹路径里
output_dir = r"C:\Users\A\Desktop\映山红\生成的文件"
# 创建 储存成功的 列表
results = []
# 创建 储存失败的 列表
failed = []
n = 0
# 先清空旧得输出 output_dir 文件夹里面的文件避免残留
for old_file in os.listdir(output_dir):
if old_file.endswith('.pdf'):
os.remove(os.path.join(output_dir,old_file))
# ↓↓↓ 收集所有 .pdf 文件,按文件名排序 | 一共得到 108个 文件
pdf_files = sorted(
f for f in os.listdir(input_dir) if f.lower().endswith('.pdf')
)
# print(len(pdf_files))
# breakpoint()
total = len(pdf_files)
# 如果 pdf_files 列表的元素是 0 个 则退出整个程序
if total == 0:
print("文件夹没有文件")
return
# 此时将已经提取的文件名称进行逐个处理
for i,filename in enumerate(pdf_files): # 循环==++==
# 路径合并!
filepath = os.path.join(input_dir, filename)
# 自定义函数 提取 日期 发票号 公司名
date_str,invoice_no,company = extract_info(filepath,filename)
if date_str:
# 成功的装进这里面
results.append((date_str,invoice_no,company,filename))
else:
# 失败的转入这里面
failed.append(filename)
results.sort(key=lambda x:(x[0],x[1]))
for idx, (date_str, invoice_no, company, filename) in enumerate(results, 1):
n = n + 1
# 类似于 VBA 中的Format 1 变成 001
seq = str(idx).zfill(3)
# 日期格式 2026年07月04日 转为 2026-07-04 使用的是 替换 的方法
date_fmt = date_str.replace('年', '-').replace('月', '-').replace('日', '')
# 拼接新的文件名
new_name = f'{seq}.{date_fmt}_{invoice_no}_{company}.pdf'
# 复制文件(保留源文件不动)
src = os.path.join(input_dir, filename)
dst = os.path.join(output_dir, new_name)
shutil.copy2(src, dst)
if __name__ == '__main__':
main()