lambda通过列表中的元素循环函数

发布于 2025-02-01 07:43:33 字数 1815 浏览 1 评论 0原文

如何调整此代码以使函数循环通过列表models_2?如果我有函数使用model有效,如果我更改为“型号_2”,它会给我这个错误:

attributeError:'float'对象没有属性'seek'

这是我的数据框架,从具有所有单元格式的Excel设置为“文本”。

        MOD1       MOD2       MOD3       MOD4
0  File1.pdf  File3.pdf  File1.pdf  File3.pdf
1  File2.pdf        NaN  File2.pdf  File3.pdf
2  File3.pdf        NaN        NaN        NaN
models = ['MOD1']
models_2 = ['MOD1', 'MOD2']

def merge_pdf(models):
    merger = PdfFileMerger()
        for name in models:
            for index, row in df.iterrows():
                merger.append(row[name])
    merger.write(f"Order #XXXXXXX ({name}) Production Package - Rev.0.pdf")
    merger.close()

merge_pdf(models)

完整错误消息:

PdfReadWarning: Xref table not zero-indexed. ID numbers for objects will be corrected. [_reader.py:1065]
Traceback (most recent call last):
  File "Z:\PyCharm\Excel_Reader\Excel_Reader.py", line 30, in <module>
    merge_pdf(models)
  File "Z:\PyCharm\Excel_Reader\Excel_Reader.py", line 27, in merge_pdf
    merger.append(row[name])
  File "C:\Users\x\AppData\Local\Programs\Python\Python39\lib\site-packages\PyPDF2\merger.py", line 227, in append
    self.merge(len(self.pages), fileobj, bookmark, pages, import_bookmarks)
  File "C:\Users\x\AppData\Local\Programs\Python\Python39\lib\site-packages\PyPDF2\merger.py", line 149, in merge
    pdfr = PdfFileReader(
  File "C:\Users\x\AppData\Local\Programs\Python\Python39\lib\site-packages\PyPDF2\_reader.py", line 239, in __init__
    self.read(stream)
  File "C:\Users\x\AppData\Local\Programs\Python\Python39\lib\site-packages\PyPDF2\_reader.py", line 911, in read
    stream.seek(-1, 2)
AttributeError: 'float' object has no attribute 'seek'

How could I adjust this code to have the function loop through the list models_2? If I have the function use models it works, if I change to `models_2' it give me this error:

AttributeError: 'float' object has no attribute 'seek'

This is my dataframe, from an excel with all cell format set to "text".

        MOD1       MOD2       MOD3       MOD4
0  File1.pdf  File3.pdf  File1.pdf  File3.pdf
1  File2.pdf        NaN  File2.pdf  File3.pdf
2  File3.pdf        NaN        NaN        NaN
models = ['MOD1']
models_2 = ['MOD1', 'MOD2']

def merge_pdf(models):
    merger = PdfFileMerger()
        for name in models:
            for index, row in df.iterrows():
                merger.append(row[name])
    merger.write(f"Order #XXXXXXX ({name}) Production Package - Rev.0.pdf")
    merger.close()

merge_pdf(models)

The full error message:

PdfReadWarning: Xref table not zero-indexed. ID numbers for objects will be corrected. [_reader.py:1065]
Traceback (most recent call last):
  File "Z:\PyCharm\Excel_Reader\Excel_Reader.py", line 30, in <module>
    merge_pdf(models)
  File "Z:\PyCharm\Excel_Reader\Excel_Reader.py", line 27, in merge_pdf
    merger.append(row[name])
  File "C:\Users\x\AppData\Local\Programs\Python\Python39\lib\site-packages\PyPDF2\merger.py", line 227, in append
    self.merge(len(self.pages), fileobj, bookmark, pages, import_bookmarks)
  File "C:\Users\x\AppData\Local\Programs\Python\Python39\lib\site-packages\PyPDF2\merger.py", line 149, in merge
    pdfr = PdfFileReader(
  File "C:\Users\x\AppData\Local\Programs\Python\Python39\lib\site-packages\PyPDF2\_reader.py", line 239, in __init__
    self.read(stream)
  File "C:\Users\x\AppData\Local\Programs\Python\Python39\lib\site-packages\PyPDF2\_reader.py", line 911, in read
    stream.seek(-1, 2)
AttributeError: 'float' object has no attribute 'seek'

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烟凡古楼 2025-02-08 07:43:33

您的代码失败了,因为列“ mod2”包含nan值,该值 float 。处理此操作的方式取决于您想对那些nan值做什么。

您可以通过运行以下代码来验证这一点:

import pandas as pd
import numpy as np

data = {
    'MOD1':['File1.pdf', 'File2.pdf', 'File3.pdf'],
    'MOD2':['File1.pdf', np.nan, np.nan],
    'MOD3':['File1.pdf', 'File2.pdf', np.nan],
    'MOD4':['File1.pdf', 'File2.pdf', np.nan]
}

df = pd.DataFrame(data)

models = ['MOD1']
models_2 = ['MOD1', 'MOD2']

merger = []

for name in models_2:
    for index, row in df.iterrows():
        print(name, index, row[name], type(row[name]))

这将打印以下内容:

MOD1 0 File1.pdf <class 'str'>
MOD1 1 File2.pdf <class 'str'>
MOD1 2 File3.pdf <class 'str'>
MOD2 0 File1.pdf <class 'str'>
MOD2 1 nan <class 'float'>
MOD2 2 nan <class 'float'>

如果您只想包含具有字符串值的单元格,则可以在将其附加到合并之前添加类型检查。对象,像这样:

models = ['MOD1']
models_2 = ['MOD1', 'MOD2']

def merge_pdf(models):
    merger = PdfFileMerger()
        for name in models:
            for index, row in df.iterrows():
                if type(row[name]) == str:
                    merger.append(row[name])
    merger.write(f"Order #XXXXXXX ({name}) Production Package - Rev.0.pdf")
    merger.close()

merge_pdf(models)

Your code is failing because the column 'MOD2' contains NaN values, which are of type float. The way you handle this depends on what you want to do with those NaN values.

You can verify that by running the following code:

import pandas as pd
import numpy as np

data = {
    'MOD1':['File1.pdf', 'File2.pdf', 'File3.pdf'],
    'MOD2':['File1.pdf', np.nan, np.nan],
    'MOD3':['File1.pdf', 'File2.pdf', np.nan],
    'MOD4':['File1.pdf', 'File2.pdf', np.nan]
}

df = pd.DataFrame(data)

models = ['MOD1']
models_2 = ['MOD1', 'MOD2']

merger = []

for name in models_2:
    for index, row in df.iterrows():
        print(name, index, row[name], type(row[name]))

This will print the following:

MOD1 0 File1.pdf <class 'str'>
MOD1 1 File2.pdf <class 'str'>
MOD1 2 File3.pdf <class 'str'>
MOD2 0 File1.pdf <class 'str'>
MOD2 1 nan <class 'float'>
MOD2 2 nan <class 'float'>

If you know you only want to include the cells with string values, you can add a type check prior to appending it to your merger object, like so:

models = ['MOD1']
models_2 = ['MOD1', 'MOD2']

def merge_pdf(models):
    merger = PdfFileMerger()
        for name in models:
            for index, row in df.iterrows():
                if type(row[name]) == str:
                    merger.append(row[name])
    merger.write(f"Order #XXXXXXX ({name}) Production Package - Rev.0.pdf")
    merger.close()

merge_pdf(models)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文