Python 如何读取整个文件夹中的已填充PDF表单,并将值传输到csv表中?
我有一个PDF表单文件夹,有6个可填充字段。如何制作一个脚本,可以读取所有表单,获取值,并将每个表单的值添加为CSV文件中的新记录 到目前为止,我已经设法使用PyPDF2读取单个文件并将所有值输入到字典中 这是我的代码:Python 如何读取整个文件夹中的已填充PDF表单,并将值传输到csv表中?,python,pdf,export-to-csv,Python,Pdf,Export To Csv,我有一个PDF表单文件夹,有6个可填充字段。如何制作一个脚本,可以读取所有表单,获取值,并将每个表单的值添加为CSV文件中的新记录 到目前为止,我已经设法使用PyPDF2读取单个文件并将所有值输入到字典中 这是我的代码: import PyPDF2 import csv f = PyPDF2.PdfFileReader('form.pdf') ff = f.getFields() 这是输出: >>> ff {'Name': {'/FT': '/Tx', '/T': 'Name
import PyPDF2
import csv
f = PyPDF2.PdfFileReader('form.pdf')
ff = f.getFields()
这是输出:
>>> ff
{'Name': {'/FT': '/Tx', '/T': 'Name', '/V': 'Mike'},
'Favourite Colour': {'/FT': '/Tx', '/T': 'Favourite Colour', '/V': 'Blue'},
'Favourite Food': {'/FT': '/Tx', '/T': 'Favourite Food', '/V': "Apple"},
'Y/N': {'/FT': '/Ch', '/T': 'Y/N', '/Ff': 131072, '/V': 'Yes', '/DV': '-'},
'Number of Siblings': {'/FT': '/Tx', '/T': 'Number of Siblings', '/V': '2'},
'Phone Number': {'/FT': '/Tx', '/T': 'Phone Number', '/V': '829-555-5555'}}
然后,我使用get()提取所需的值:
gg = {}
gg['Name'] = ff.get('Name').get('/V')
gg['Favourite Colour'] = ff.get('Favourite Colour').get('/V')
gg['Favourite Food'] = ff.get('Favourite Food').get('/V')
gg['Y/N'] = ff.get('Y/N').get('/V')
gg['Number of Siblings'] = ff.get('Number of Siblings').get('/V')
gg['Phone Number'] = ff.get('Phone Number').get('/V')
这给了我:
>>> gg
{'Name': 'Mike', 'Favourite Colour': 'Blue', 'Favourite Food': 'Apple', 'Y/N': 'Yes', 'Number of Siblings': '10', 'Phone Number': '829-555-5555'}
但现在我不知道如何将其打印到CSV。问题还在于我有几十个这样的PDF表单,所以我不能只更改f=PyPDF2.PdfFileReader('form.PDF')
,然后一个接一个地做
是否有一种方法可以读取完整的PDF表单文件夹,并将每个表单的值打印为CSV中的唯一记录
任何帮助都将不胜感激。谢谢大家! 您可以使用
dict
-comprehension使数据提取更清晰,即:
ff = {'Name': {'/FT': '/Tx', '/T': 'Name', '/V': 'Mike'},
'Favourite Colour': {'/FT': '/Tx', '/T': 'Favourite Colour', '/V': 'Blue'},
'Favourite Food': {'/FT': '/Tx', '/T': 'Favourite Food', '/V': "Apple"},
'Y/N': {'/FT': '/Ch', '/T': 'Y/N', '/Ff': 131072, '/V': 'Yes', '/DV': '-'},
'Number of Siblings': {'/FT': '/Tx', '/T': 'Number of Siblings', '/V': '2'},
'Phone Number': {'/FT': '/Tx', '/T': 'Phone Number', '/V': '829-555-5555'}}
gg = {k:v['/V'] for k,v in ff.items()}
print(gg)
输出:
{'Name': 'Mike', 'Favourite Colour': 'Blue', 'Favourite Food': 'Apple', 'Y/N': 'Yes', 'Number of Siblings': '2', 'Phone Number': '829-555-5555'}
请注意,我们不必硬编码字段以这种方式执行此操作。如果您要处理的所有文件的名称都以.pdf
结尾,并且没有任何文件具有此类名称,并且实际上不是pdf文件,则您可以使用glob
内置模块,然后再使用它进行处理,请检查是否存在以下情况:
import glob
for filename in glob.glob("*.pdf"):
print(filename)
是否输出所有要处理的文件。要编写CSV文件,您可以利用内置模块
CSV
完成四分之三的工作
创建一个函数来包装您迄今为止所做的工作。给它起个好名字,比如pdf\u form\u field\u values(pdf\u path)
。对于给定的pdf文件路径,这将返回一个字典
您还需要在文件夹中的所有PDF上创建一个循环。你可以用它
您可以使用文件写入csv文件。如果你想要一个标题,你可以告诉作者去创建它。您还可以告诉作者您希望列的顺序
总而言之:
from glob import glob
import csv
with io.open('results.csv', mode='w', newline='') as output:
columns = ['Name', 'Favourite Colour', 'Favourite Food', 'Y/N',
'Number of Siblings', 'Phone Number']
writer = csv.DictWriter(output, columns)
writer.writeheader() # optional
for pdf_path in glob('*.pdf'):
fields = pdf_form_field_values(pdf_path)
writer.write(fields)
我还没有测试过这段代码,所以可能会有一些小错误,但您知道了。根据您的想法,您应该执行
writer.writeheader()
,以便使用header@Daweo对不起,我记错了。将很快纠正。@Daweo已修复,谢谢您的帮助