我想循环浏览目录中的所有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的内容。对于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+,另一个可以改进的地方是用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_text
将是一行,否则您的csv
文件将有点损坏。解决这个问题的一种方法是选择一个任意字符来代替新的换行符。例如,如果选择管道字符,则可以在writer.writerow
:之前执行类似操作
pdf_text.replace('n', '|')
这不是一个完整的例子,而是一个起点。我希望它能有所帮助。