Python 将数据从PDFform转换为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

我正在尝试将在多个可填充pdf表单中输入的数据转换为一个csv文件。
此代码由几个步骤组成:

  • 打开新的.csv文件(标题行)
  • 使用“for…in”循环打开多个pdf表单
  • 将表单字段中输入的数据转换为csv
  • 但是,在运行命令时,我收到错误:

    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'))