为了账号安全,请及时绑定邮箱和手机立即绑定

从多个 PDF 中提取文本并写入单个 CSV

从多个 PDF 中提取文本并写入单个 CSV

Cats萌萌 2022-08-16 16:24:42
我想遍历目录中的所有PDF,使用PDFminer从每个PDF中提取文本,然后将输出写入单个CSV文件。我能够通过将文本传递给此处定义的函数来单独从每个PDF中提取文本。我还能够获得给定目录中所有PDF文件名的列表。但是,当我尝试将两者放在一起并将结果写入单个CSV时,我得到了一个带有标头但没有数据的CSV。这是我的代码:import ospdf_files = [name for name in os.listdir("C:\\My\\Directory\\Path") if name.endswith(".pdf")] #get all files in directory    pdf_files_path = ["C:\\My\\Directory\\Path\\" + pdf_files[i] for i in range(len(pdf_files))] #add directory pathimport pandas as pddf = pd.DataFrame(columns=['FileName','Text'])for i in range(len(pdf_files)):    scraped_text = convert_pdf_to_txt(pdf_files_path[i])    df.append({ 'FileName': pdf_files[i], 'Text': scraped_text[i]},ignore_index=True)df.to_csv('output.csv')变量具有以下值:pdf_files: ['12280_2007_Article_9000.pdf', '12280_2007_Article_9001.pdf', '12280_2007_Article_9002.pdf', '12280_2007_Article_9003.pdf', '12280_2007_Article_9004.pdf', '12280_2007_Article_9005.pdf', '12280_2007_Article_9006.pdf', '12280_2007_Article_9007.pdf', '12280_2007_Article_9008.pdf', '12280_2007_Article_9009.pdf']pdf_files_path: ['C:\\My\\Directory Path\\12280_2007_Article_9000.pdf', etc...]Empty DataFrameColumns: [FileName, Text]Index: []更新:根据@AMC的建议,我在循环中检查了scraped_text的内容。对于“文本”列,似乎我正在循环遍历第一个PDF文件中的字符,而不是直接循环遍历每个文件。此外,循环的内容不会写入数据帧或 CSV。12280_2007_Article_9000.pdf E12280_2007_Article_9001.pdf a12280_2007_Article_9002.pdf s12280_2007_Article_9003.pdf t12280_2007_Article_9004.pdf  12280_2007_Article_9005.pdf A12280_2007_Article_9006.pdf s12280_2007_Article_9007.pdf i12280_2007_Article_9008.pdf a12280_2007_Article_9009.pdf n
查看完整描述

1 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

我想你不需要这个。您可以使用标准库 csv 使其更简单。pandas

如果您使用的是Python 3.4 +,另一件可以改进的事情是用pathlib替换。os

下面是一个几乎完整的示例:

import csv

from pathlib import Path



folder = Path('c:/My/Directory/Path')

csv_file = Path('c:/path/to/output.csv')


with csv_file.open('w', encoding='utf-8') as f:

    writer = csv.writer(f, csv.QUOTE_ALL)


    writer.writerow(['FileName', 'Text'])


    for pdf_file in folder.glob('*.pdf'):

        pdf_text = convert_pdf_to_txt(pdf_file).replace('\n', '|')

        writer.writerow([pdf_file.name, pdf_text]) 

要记住的另一件事是确保将是一行,否则您的文件将会损坏。解决此问题的一种方法是选择任意字符来代替新行标记。例如,如果您选择管道字符,则可以在以下操作之前执行类似操作:pdf_textcsvwriter.writerow


pdf_text.replace('\n', '|')

它不是一个完整的例子,而是一个起点。我希望它有帮助。


查看完整回答
反对 回复 2022-08-16
  • 1 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信