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

Extract text from multiple PDFs and write to a single CSV

我想遍历目录中的所有 PDF,使用 PDFminer 从每个 PDF 中提取文本,然后将输出写入单个 CSV 文件。通过将每个 PDF 传递给定义的函数 here,我能够从每个 PDF 中单独提取文本。我还可以获得给定目录中所有 PDF 文件名的列表。但是当我尝试将两者放在一起并将结果写入单个 CSV 时,我得到了一个带有 headers 但没有数据的 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 的内容。对于 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

我猜你不需要 pandas。您可以使用标准库 csv.

使其更简单

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

这是一个几乎完整的例子:

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_text 是单行,否则你的 csv 文件会被破坏。解决这个问题的一种方法是选择一个任意字符来代替新的行标记。例如,如果你选择竖线字符,那么你可以在 writer.writerow:

之前做这样的事情
pdf_text.replace('\n', '|')

这不是一个完整的示例,而是一个起点。希望对你有帮助。