【问题标题】:missing required positional arguments for a named tuple缺少命名元组所需的位置参数
【发布时间】:2021-07-18 05:55:23
【问题描述】:

我是编程新手。我正在编写一个从 pdf 中提取数据的 Python 脚本。我在处理元组时遇到了麻烦。我无法提供它的论点。我认为是我的逻辑不正确,包括缩进、顺序或其他。

我希望得到一些关于我为什么会收到错误的解释。

这是我的 PDF 样本(我必须屏蔽一些敏感信息)

这就是我想要达到的目标

我收到此错误:

Traceback (most recent call last):
  File "/Users/jeff/PycharmProjects/extractFreightInvoice/main.py", line 79, in <module>
    lines.append(Line('invDate, invNumber, poNumber, contactName, jobNumber, '
TypeError: <lambda>() missing 11 required positional arguments: 'invNumber', 'poNumber', 'contactName', 'jobNumber', 'jobName', 'invDescription', 'siteAddress', 'invItemsDesc', 'invItemsQty', 'invItemsUnitPrice', and 'invItemsAmount'

我的代码如下:

# This is a pdf extractor
import re
import pdfplumber
import pandas as pd
from collections import namedtuple

Line = namedtuple('Line', 'invDate, invNumber, poNumber, contactName, jobNumber, '
                          'jobName, invDescription, siteAddress, invItemsDesc, invItemsQty, invItemsUnitPrice, '
                          'invItemsAmount ')

invDate_re = re.compile(r'(Clever Core NZ Limited\s)(\d{1,2}/\d{1,2}/\d{4})(.+)')
invNumber_re = re.compile(r'(IN\d{6})')
poNumber_re = re.compile(r'\d{4}')
contactNameBen_re = re.compile(r'(Jordan\s.+)')
contactNameCraig_re = re.compile(r'(Lorna\s.+)')
jobNumber_re = re.compile(r'(J[\d]{6})')
jobName_re = re.compile(r'(Job Name)')
invDescription_re = re.compile(r'(Invoice Description)')
siteAddress_re = re.compile(r'(Site address.*)')
colHeading_re = re.compile(r'((Description)(.* Quantity.* Unit Price.*))')
invItems_re = re.compile(
    r'(.+) (([0-9]*[.])?[0-9]+) (([0-9]*[.])?[0-9]+) (\d*\?\d+|\d{1,3}(,\d{3})*(\.\d+)?)')
# quoteLines_re = re.compile(r'(.+)(:\s*)(.+)')
# clevercorePriceLine_re = re.compile(r'(.* First .*\s?)(-\s?.*\$)(\s*)(.+)')

file = 'CombinedInvoicePdf.pdf'

lines = []

with pdfplumber.open(file) as myPdf:
    for page in myPdf.pages:
        text = page.extract_text()
        lines = text.split('\n')
        index = 0
        for i in range(len(lines)):

            line = lines[i]

            invDateLine = invDate_re.search(line)
            invNumberLine = invNumber_re.search(line)
            poNumberLine = poNumber_re.search(line)
            contactNameJordanLine = contactNameJordan_re.search(line)
            contactNameLornaLine = contactNameLorna_re.search(line)
            jobNumberLine = jobNumber_re.search(line)
            jobNameLine = jobName_re.search(line)
            invDescriptionLine = invDescription_re.search(line)
            colHeadingLine = colHeading_re.search(line)
            siteAddressLine = siteAddress_re.search(line)
            invItemsLine = invItems_re.search(line)

            if invDateLine:
                invDate = invDateLine.group(2)
            if invNumberLine:
                invNumber = invNumberLine.group(1)
            if poNumberLine and len(line) == 4:
                poNumber = poNumberLine.group(0)
            if contactNameBenLine:
                contactName = 'Jordan Michael'
            if contactNameCraigLine:
                contactName = 'Lorna Tolentin'
            if jobNumberLine:
                jobNumber = lines[i]
            if jobNameLine:
                jobName = (lines[i + 1])
            if invDescriptionLine:
                invDescription = lines[i + 1]
            if siteAddressLine:
                if len(lines[i + 1]) > 0 and len(lines[i + 1]) == 0:
                    siteAddress = lines[i + 1]
                elif len(lines[i + 1]) > 0 and len(lines[i + 1]) > 0:
                    siteAddress = lines[i + 1] + ' ' + lines[i + 2]
                else:
                    siteAddress = 'check invoice'
            if invItemsLine and invItemsLine[2] != '06':
                invItemsDesc = invItemsLine.group(1)
                invItemsQty = invItemsLine.group(2)
                invItemsUnitPrice = invItemsLine.group(4)
                invItemsAmount = invItemsLine.group(6)
            lines.append(Line('invDate, invNumber, poNumber, contactName, jobNumber, '
                              'jobName, invDescription, siteAddress, invItemsDesc, invItemsQty, invItemsUnitPrice, '
                              'inItemsAmount'))
df = pd.DataFrame(lines)
print(df)
print(df.head())
df.to_csv('freightCharges.csv')

【问题讨论】:

    标签: python tuples data-extraction


    【解决方案1】:

    Line 是带有参数和字段的tuple 子类

    您需要用单独的参数填充它们,而不是单个字符串

    lines.append(Line('invDate', 'invNumber', 'poNumber', 'contactName', 'jobNumber', 'jobName', 'invDescription',
                      'siteAddress', 'invItemsDesc', 'invItemsQty', 'invItemsUnitPrice', 'inItemsAmount'))
    

    【讨论】:

    • 所有这些字符串实际上都是变量名。
    • invDate、invNumber、poNumber 等是变量名。我的代码中的每一个都没有单引号。
    • @Autom8 这就是问题所在。
    • 帮我理解一下。我是否必须将 invDate、invNumber、poNumber... 括在单引号中?干杯
    • @Autom8 你没有,完全按照我的回答使用它。
    猜你喜欢
    • 2022-01-09
    • 2018-06-22
    • 2021-04-07
    • 1970-01-01
    • 2021-03-19
    • 2021-10-01
    • 1970-01-01
    • 2021-12-20
    • 2021-01-16
    相关资源
    最近更新 更多