从多个 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', '|')
这不是一个完整的示例,而是一个起点。希望对你有帮助。
我想遍历目录中的所有 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', '|')
这不是一个完整的示例,而是一个起点。希望对你有帮助。