实现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
的格式。
需要注意的是,为了避免文件名中出现不合法字符(例如文件名中的空格、斜杠等),可以事先对 bb
、dd
、cc
进行处理,去掉这些字符或将其替换为其他合法字符。
以下是示例代码:
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
格式。中间加下划线 _
是为了分隔 bb
、dd
、cc
这三个名字,并且更加直观。
其中,使用 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()