怎样用提取的pdf信息重命名文件名

实现PDF发票信息提取后怎样实现PDF文件名重命名为bb+dd+cc


def read():
    filenames = get_pdf(r'C:\Users\Administrator\Desktop\测试')  # 修改为自己的文件目录
    for filename in filenames:
        print(filename)
        with pdfplumber.open(filename) as pdf:
            first_page = pdf.pages[0]
            pdf_text = first_page.extract_text()
            if '发票' not in pdf_text:
                continue
            # print(pdf_text)
            print('--------------------------------------------------------')
            bb = re_text(re.compile(r'名\s*称\s*[::]\s*([\u4e00-\u9fa5]+)'), pdf_text)
            print(bb)
            cc = re_text(re.compile(r'([\u4e00-\u9fa5]+)服务费'), pdf_text)
            print(cc)
            cop = re.compile('[\u4e00-\u9fa5]')
            dd = re_text(re.compile(r'HDGY(.*?)-\d{4}', re.S), pdf_text)
            dd = dd.replace('\n', '')
            dd = cop.sub('', dd)
            print(dd)
            company = re.findall(re.compile(r'名.*称\s*[::]\s*([\u4e00-\u9fa5]+)'), pdf_text)
            if company:
                print(re_block(company[len(company) - 1]))
            print('--------------------------------------------------------')


read()

引用chatgpt部分指引作答:
要实现PDF文件名重命名为bb+dd+cc,你可以在read()函数中添加重命名文件的代码。以下是一个示例:

import os

def read():
    filenames = get_pdf(r'C:\Users\Administrator\Desktop\测试')  # 修改为自己的文件目录
    for filename in filenames:
        print(filename)
        with pdfplumber.open(filename) as pdf:
            first_page = pdf.pages[0]
            pdf_text = first_page.extract_text()
            if '发票' not in pdf_text:
                continue
            # print(pdf_text)
            print('--------------------------------------------------------')
            bb = re_text(re.compile(r'名\s*称\s*[::]\s*([\u4e00-\u9fa5]+)'), pdf_text)
            print(bb)
            cc = re_text(re.compile(r'([\u4e00-\u9fa5]+)服务费'), pdf_text)
            print(cc)
            cop = re.compile('[\u4e00-\u9fa5]')
            dd = re_text(re.compile(r'HDGY(.*?)-\d{4}', re.S), pdf_text)
            dd = dd.replace('\n', '')
            dd = cop.sub('', dd)
            print(dd)
            company = re.findall(re.compile(r'名.*称\s*[::]\s*([\u4e00-\u9fa5]+)'), pdf_text)
            if company:
                print(re_block(company[len(company) - 1]))
            print('--------------------------------------------------------')
            
            new_filename = f"bb{dd}{cc}.pdf"  # 新的文件名,根据需要自行调整命名规则
            new_filepath = os.path.join(os.path.dirname(filename), new_filename)
            os.rename(filename, new_filepath)
            print(f"文件已重命名为:{new_filename}")

read()

在上述代码中,我们使用os.rename()函数将原始文件名修改为新的文件名。新文件名的格式是根据你的要求进行调整的,你可以根据需要自定义命名规则。
重命名操作是对源文件进行修改,因此请谨慎操作,并确保你在进行此操作之前已经备份了文件。


import pandas as pd
import os
 
# 读取Excel文件
excel_file_path = r"C:\Users\xxy_2\Desktop\映射关系.xlsx"  # 替换成你的Excel文件路径
df = pd.read_excel(excel_file_path)
 
# 将Excel中的映射关系转换为字典
mapping_dict = df.set_index(df.columns[0])[df.columns[1]].to_dict()
 
# 遍历文件夹下的所有文件
folder_path = r"C:\Users\xxy_2\Desktop\临时" # 替换成你的文件夹路径
for filename in os.listdir(folder_path):
    if filename.endswith('.pdf'):  # 只处理PDF文件
        original_file_path = os.path.join(folder_path, filename)  # 拼接原文件的完整路径
 
        # 检查原文件是否存在于映射关系中
        original_file_name = os.path.splitext(filename)[0]  # 获取文件名(不包含扩展名)
        if original_file_name in mapping_dict:
            new_file_name = mapping_dict[original_file_name]  # 获取新文件名
 
            new_file_path = os.path.join(folder_path, f'{new_file_name}.pdf')  # 拼接新文件的完整路径
 
            # 检查新文件是否已经存在,如果存在,则添加后缀
            if os.path.exists(new_file_path):
                new_file_path = os.path.join(folder_path, f'{new_file_name}_new.pdf')
 
            # 重命名文件
            os.rename(original_file_path, new_file_path)
            print(f'文件已重命名: {original_file_path} -> {new_file_path}')
        else:
            print(f'文件名在Excel中未找到映射关系: {original_file_name}')

os.rename(filename, new_filepath)
PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。

出现这个问题,你需要先将这个目录中之前的打开文件,先进行关闭。

这个问题有点东西, 不过我手里没有pdf 的发票文件, 方便给我一下吗? 我本地跑下

首先确保你已经把需要操作的pdf文件关闭了,并且没有其他程序在占用它。然后运行:

import os
 
def read():
    filenames = get_pdf(r'C:\Users\Administrator\Desktop\测试')  # 修改为自己的文件目录
    for filename in filenames:
        print(filename)
        with pdfplumber.open(filename) as pdf:
            first_page = pdf.pages[0]
            pdf_text = first_page.extract_text()
            if '发票' not in pdf_text:
                continue
            # print(pdf_text)
            print('--------------------------------------------------------')
            bb = re_text(re.compile(r'名\s*称\s*[::]\s*([\u4e00-\u9fa5]+)'), pdf_text)
            print(bb)
            cc = re_text(re.compile(r'([\u4e00-\u9fa5]+)服务费'), pdf_text)
            print(cc)
            cop = re.compile('[\u4e00-\u9fa5]')
            dd = re_text(re.compile(r'HDGY(.*?)-\d{4}', re.S), pdf_text)
            dd = dd.replace('\n', '')
            dd = cop.sub('', dd)
            print(dd)
            company = re.findall(re.compile(r'名.*称\s*[::]\s*([\u4e00-\u9fa5]+)'), pdf_text)
            if company:
                print(re_block(company[len(company) - 1]))
            print('--------------------------------------------------------')
            
            new_filename = f"bb{dd}{cc}.pdf"  # 新的文件名,根据需要自行调整命名规则
            new_filepath = os.path.join(os.path.dirname(filename), new_filename)
            pdf.close()  # 关闭当前文件
            os.rename(filename, new_filepath)
            print(f"文件已重命名为:{new_filename}")
 
read()

以下的内容来自chat gpt的回答:
在 Python 中,可以使用 os.rename() 函数实现文件重命名功能,将 PDF 文件名重命名为 bb+dd+cc.pdf 的格式。

需要注意的是,为了避免文件名中出现不合法字符(例如文件名中的空格、斜杠等),可以事先对 bbddcc 进行处理,去掉这些字符或将其替换为其他合法字符。

以下是示例代码:

import os
import pdfplumber
import re
 
 
def read():
    filenames = get_pdf(r'C:\Users\Administrator\Desktop\测试')  # 修改为自己的文件目录
    for filename in filenames:
        print(filename)
        # 获取文件名、扩展名
        basename = os.path.basename(filename)
        name, ext = os.path.splitext(basename)
 
        with pdfplumber.open(filename) as pdf:
            first_page = pdf.pages[0]
            pdf_text = first_page.extract_text()
            if '发票' not in pdf_text:
                continue
            # print(pdf_text)
            print('--------------------------------------------------------')
            bb = re_text(re.compile(r'名\s*称\s*[::]\s*([\u4e00-\u9fa5]+)'), pdf_text)
            print(bb)
            cc = re_text(re.compile(r'([\u4e00-\u9fa5]+)服务费'), pdf_text)
            print(cc)
            cop = re.compile('[\u4e00-\u9fa5]')
            dd = re_text(re.compile(r'HDGY(.*?)-\d{4}', re.S), pdf_text)
            dd = dd.replace('\n', '')
            dd = cop.sub('', dd)
            dd = dd.replace(' ', '') # 替换空格
            print(dd)
 
            # 文件名重命名
            new_name = bb + '_' + dd + '_' + cc + ext
            new_name = new_name.replace(' ', '') # 替换空格
            new_path = os.path.join(os.path.dirname(filename), new_name)
            os.rename(filename, new_path)
 
            company = re.findall(re.compile(r'名.*称\s*[::]\s*([\u4e00-\u9fa5]+)'), pdf_text)
            if company:
                print(re_block(company[len(company) - 1]))
            print('--------------------------------------------------------')
 
 
read()

在代码中,我们使用 os.path.basename()os.path.splitext() 函数获取了 PDF 文件的文件名和扩展名。然后使用 os.rename() 函数将文件名重命名,并将其设置为 bb+dd+cc.pdf 格式。中间加下划线 _ 是为了分隔 bbddcc 这三个名字,并且更加直观。

其中,使用 replace() 函数替换了文件名中的空格,确保文件名中不出现无效字符。


def read():
    file_path = r"C:\Users\Administrator\Desktop\测试"  # 修改为自己的文件目录
    filenames = get_pdf(file_path)
    for filename in filenames:
        print(filename)
        with pdfplumber.open(filename) as pdf:
            first_page = pdf.pages[0]
            pdf_text = first_page.extract_text()
            if "发票" not in pdf_text:
                continue
            # print(pdf_text)
            print("--------------------------------------------------------")
            bb = re_text(re.compile(r"名\s*称\s*[::]\s*([\u4e00-\u9fa5]+)"), pdf_text)
            print(bb)
            cc = re_text(re.compile(r"([\u4e00-\u9fa5]+)服务费"), pdf_text)
            print(cc)
            cop = re.compile("[\u4e00-\u9fa5]")
            dd = re_text(re.compile(r"HDGY(.*?)-\d{4}", re.S), pdf_text)
            dd = dd.replace("\n", "")
            dd = cop.sub("", dd)
            print(dd)
            company = re.findall(
                re.compile(r"名.*称\s*[::]\s*([\u4e00-\u9fa5]+)"), pdf_text
            )
            if company:
                print(re_block(company[len(company) - 1]))
            print("--------------------------------------------------------")

            new = os.path.join(file_path, f"{bb}{dd}{cc}.pdf")
            try:
                os.rename(filename, new)
                print(f"文件已重命名为:{new}")
            except:
                print(f"重命名失败")


read()