Python&Pandas:使用pdfplumber提取PDF文本时如何合并多行到单个单元格
错误原因排查
- 未关闭写入中的文件就直接读取:调用
pd.read_csv时,file2还处于打开状态,操作系统的文件缓冲区内容未完全刷入磁盘,导致读取到的内容缺失最后一行。 - 方法误用:
pd.concat是用来拼接数据表结构的,无法实现多行文本合并为单个字符串的需求。 - 参数错误:
pd.read_csv传入的第二个参数'r'会被识别为分隔符参数,导致CSV读取解析错误,内容无法正常拆分。 - 多余的字节编码:提取文本后直接执行
encode('UTF-8')会将字符串转为字节对象,写入CSV后会显示为b'xxx'的格式,不是可读的普通文本。
最优实现方案
无需生成中间文件,直接在提取文本的过程中拼接所有页内容,效率更高:
import pdfplumber import csv # 初始化全文字符串 full_text = "" with pdfplumber.open('target.pdf') as pdf: for page in pdf.pages: page_text = page.extract_text() # 跳过无文本的空白页 if page_text: # 可自定义页之间的分隔符,此处用两个换行分隔 full_text += page_text + "\n\n" # 直接写入单个CSV单元格 with open("pdf_texts.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) # 写入表头 writer.writerow(["text"]) # 单个单元格写入全部文本 writer.writerow([full_text])
原有逻辑修正方案
如果需要保留生成每页文本临时文件的逻辑,修正后的代码如下:
import pdfplumber import pandas as pd import csv # 先写入每页文本到临时文件,完成后主动关闭文件 with open("pdf_text_pgs.csv", "w", newline="", encoding="utf-8") as file2: writer2 = csv.writer(file2) writer2.writerow(['text']) with pdfplumber.open('target.pdf') as pdf: for page in pdf.pages: pdf_txt = page.extract_text() if pdf_txt: writer2.writerow([pdf_txt]) # 读取临时文件后合并所有文本 df = pd.read_csv("pdf_text_pgs.csv") # 用两个换行作为每页文本的分隔符 full_text = df['text'].str.cat(sep='\n\n') # 写入最终文件 pd.DataFrame([full_text], columns=['text']).to_csv('pdf_texts.csv', index=False)
内容的提问来源于stack exchange,提问作者Daniel Hutchinson
相关产品推荐
相关产品推荐

