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

我想遍历目录中的所有PDF,使用PDFminer从每个PDF中提取文本,然后将输出写入单个CSV文件。我能够通过将文本传递给此处定义的函数来单独从每个PDF中提取文本。我还能够获得给定目录中所有PDF文件名的列表。但是,当我尝试将两者放在一起并将结果写入单个CSV时,我得到了一个带有标头但没有数据的CSV。


这是我的代码:


import os

pdf_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 path


import pandas as pd

df = 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 DataFrame

Columns: [FileName, Text]

Index: []

更新:根据@AMC的建议,我在循环中检查了scraped_text的内容。对于“文本”列,似乎我正在循环遍历第一个PDF文件中的字符,而不是直接循环遍历每个文件。此外,循环的内容不会写入数据帧或 CSV。


12280_2007_Article_9000.pdf E

12280_2007_Article_9001.pdf a

12280_2007_Article_9002.pdf s

12280_2007_Article_9003.pdf t

12280_2007_Article_9004.pdf  

12280_2007_Article_9005.pdf A

12280_2007_Article_9006.pdf s

12280_2007_Article_9007.pdf i

12280_2007_Article_9008.pdf a

12280_2007_Article_9009.pdf n


Cats萌萌
浏览 112回答 1
1回答

慕尼黑的夜晚无繁华

我想你不需要这个。您可以使用标准库 csv 使其更简单。pandas如果您使用的是Python 3.4 +,另一件可以改进的事情是用pathlib替换。os下面是一个几乎完整的示例:import csvfrom pathlib import Pathfolder = 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.writerowpdf_text.replace('\n', '|')它不是一个完整的例子,而是一个起点。我希望它有帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python