【问题标题】:Reading pdf file names from a csv and merge pdfs从 csv 读取 pdf 文件名并合并 pdf
【发布时间】:2018-10-08 18:43:28
【问题描述】:

我已经改组了一个 csv 文件,其中包含引用 pdf 文件的文件名:

list1 = list(csv.reader(open('input.csv')))

random.shuffle(list1)
outputwriter = csv.writer(open("random.csv", "wb"))
outputwriter.writerows(list1)

如您所见,我也将结果写入了一个新的 csv 文件,但我认为这没有必要。无论如何,随机打乱的列表看起来像这样:

R001.pdf
L008.pdf
L009.pdf
L011.pdf
R006.pdf
L014.pdf
L016.pdf
R019.pdf
R021.pdf
R005.pdf
R007.pdf
L010.pdf
R004.pdf
L015.pdf
L018.pdf
L003.pdf
L012.pdf
L002.pdf
L017.pdf
L020.pdf
R013.pdf

我现在想做的是使用 PyPDF2 以现在的随机顺序合并这些 pdf。

from PyPDF2 import PdfFileMerger
merger = PdfFileMerger()
for x in list1:
    merger.append(x)

merger.write("result.pdf")

但是,这会产生以下错误:

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

有人知道我做错了什么吗?我还尝试从新的 random.csv 中读取列表,如下所示:

merger = PdfFileMerger()
with open("random.csv") as f:
    r = csv.reader(f)
for x in r:
    merger.append(x)

然而,这也会导致错误:

ValueError: I/O operation on closed file

我真的很高兴学习如何做到这一点! :)

【问题讨论】:

  • Re: 最后一个错误,Python 使用with open.. 块在文件离开块时自动关闭文件。这就是它抱怨文件已关闭的原因。

标签: python csv pdf pypdf2


【解决方案1】:

list(csv.reader(fileobj)) 返回一个列表列表。

The documentationPdfFileMerger.append() 接受一个文件对象参数,你正在传递它列表。 .试试:

from PyPDF2 import PdfFileMerger
merger = PdfFileMerger()
for x in list1:
    with open(x[0]) as f:
        merger.append(f)

merger.write("result.pdf")

【讨论】:

  • 感谢您的建议!不幸的是,这也会导致错误:TypeError: coercing to Unicode: need string or buffer, list found
  • 啊啊啊! “list(csv.reader(fileobj)) 返回列表列表。”这就是为什么!感谢您帮助我理解这一点! :)
【解决方案2】:

您正在打开文件而不是关闭它们。每当您使用 .open() 而不使用 .close() 时,都可能会发生错误。

始终首选使用上下文管理器,就像您在上一个示例中所做的那样。

with open('filename.ext', mode='somemodeR\W') 因为这会自动关闭它,您不必担心每次打开时手动关闭文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 2011-07-12
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多