从csv中读取pdf文件名并合并pdf

时间:2018-04-27 21:29:57

标签: python csv pdf pypdf2

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

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

我很乐意学会如何做到这一点! :)

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-1)

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

总是首选使用上一个示例中的上下文管理器。

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