Python 将数据从PDFform转换为CSV
我正在尝试将在多个可填充pdf表单中输入的数据转换为一个csv文件。Python 将数据从PDFform转换为CSV,python,python-2.7,csv,pdf,pdf-form,Python,Python 2.7,Csv,Pdf,Pdf Form,我正在尝试将在多个可填充pdf表单中输入的数据转换为一个csv文件。 此代码由几个步骤组成: 打开新的.csv文件(标题行) 使用“for…in”循环打开多个pdf表单 将表单字段中输入的数据转换为csv 但是,在运行命令时,我收到错误: fc-int01-generateapearance:无 回溯(最近一次呼叫最后一次): 文件“C:\Python27\Scripts\test3.py”,第31行,在 writer.writerow(值) _csv.错误:应为序列 如果我只是在python
此代码由几个步骤组成:
fc-int01-generateapearance:无
回溯(最近一次呼叫最后一次):
文件“C:\Python27\Scripts\test3.py”,第31行,在
writer.writerow(值)
_csv.错误:应为序列
如果我只是在python中输入打印值(表单数据),它就可以工作。但是,导入数据并不是这样。可能还有一个问题,就是从一行到另一列都有值。我希望我明白了
这是我的密码:
import glob
import os
import sys
import csv
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdftypes import resolve1
#input file path for specific file
#filename = "C:\Python27\Scripts\MH_1.pdf"
#fp = open(filename, 'rb')
#open new csv file
out_file=open('C:\Users\Wonen\Downloads\Test\output.csv', 'w+')
writer = csv.writer(out_file)
#header row
writer.writerow(('Name coordinator', 'Date', 'Address', 'District',
'City', 'Complaintnr'))
#enter folder path to open multiple files
path = 'C:\Users\Wonen\Downloads\Test'
for filename in glob.glob(os.path.join(path, '*.pdf')):
fp = open(filename, 'rb')
#read pdf's
parser = PDFParser(fp)
doc = PDFDocument(parser)
#doc.initialize() # <<if password is required
fields = resolve1(doc.catalog['AcroForm'])['Fields']
for i in fields:
field = resolve1(i)
name, value = field.get('T'), field.get('V')
print '{0}: {1}'.format(name, value)
writer.writerow(value)
等。“无”代表“空文本框”;“1”和“0”代表“是”和“否”输出。尝试更改代码的最后一部分,如图所示:
.
.
.
#enter folder path to open multiple files
path = 'C:\Users\Wonen\Downloads\Test'
for filename in glob.glob(os.path.join(path, '*.pdf')):
fp = open(filename, 'rb')
#read pdf's
parser = PDFParser(fp)
doc = PDFDocument(parser)
#doc.initialize() # <<if password is required
fields = resolve1(doc.catalog['AcroForm'])['Fields']
row = []
for i in fields:
field = resolve1(i)
name, value = field.get('T'), field.get('V')
row.append(value)
writer.writerow(row)
out_file.close()
定义写入的每行中包含多少字段值。这意味着字段
应该是一个列表,其中包含按该顺序排列的这6个项目的数据
您需要了解如何将每组
字段中的内容转换为包含6个数据项的行。这就是我答案中的代码所做的-我想,但无法测试。在错误发生前一行的print
函数的输出是什么?值需要是一个序列。如果还没有,请尝试writer.writerow([value])
@martineau,问题几乎解决了。我希望它是一行逗号分隔的值(清除中间的空白)。但这远远超出了我对python的了解。writerow()
将在传递给它的序列中的每个元素之间放置一个逗号作为参数。使用[value]
时,序列仅由一个元素组成,即value
中的所有元素。请告诉我们值中的数据是什么样子的。如果每个字段都不一样,那么我们也需要知道这一点。@martineau我编辑了这条评论。这看起来好多了!我还有两个问题。1.某些值字段允许“输入”并在csv中使输出跳转行。2.脚本向后刮取表单。writer.writerow(('Name coordinator','Date','Address','District','City','Complaintnr'))
在csv中写入我的标题行。我给了你一个标题代码示例。表单有25个问题,因此将包含25个标题,而不是6个。这一行比这里显示的要长得多。在将值附加到行列表之前,您可能需要检查这些值。这样,您就可以更改在特殊情况下添加的内容,例如当出现“回车”或None
时。如果“向后刮取”是指字段值的顺序相反,那么您可以使用writer.writerow(list(reversed(row))
writer解决这个问题。writerow(list(reversed(row))
正是我需要的,再次感谢。“在将值添加到行列表之前检查值”我不知道如何。好的提示。我会在网上搜索,除非你准备好了解决方案:-)你可以用一系列if
语句检查并更正行前面的值。append()
:即如果值为None:value=''
,elif value='1':value='yes'
,等等。如果我的答案对你有帮助,请考虑接受和/或上投票。谢谢
writer.writerow(('Name coordinator', 'Date', 'Address','District','City', 'Complaintnr'))