Чтение имен PDF-файлов из csv и объединение PDF-файлов

Я перетасовал 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

Что я хотел сделать сейчас, так это объединить эти PDF-файлы в случайном порядке, используя PyPDF2.

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

Я был бы очень рад научиться делать это! :)


person Fabian    schedule 27.04.2018    source источник
comment
Как отлаживать небольшие программы   -  person wwii    schedule 28.04.2018
comment
Re: последняя ошибка, Python использует блок with open.. для автоматического закрытия файла, когда он покидает блок. Вот почему он жалуется, что файл уже закрыт.   -  person Jongware    schedule 28.04.2018


Ответы (2)


list(csv.reader(fileobj)) возвращает список списков.

В документации говорится, что PdfFileMerger.append() принимает аргумент файлового объекта, вы передаете его списки. . Пытаться:

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

merger.write("result.pdf")
person wwii    schedule 27.04.2018
comment
Спасибо за предложения! К сожалению, это тоже приводит к ошибке: TypeError: coercing to Unicode: need string or buffer, list found - person Fabian; 28.04.2018
comment
Аааа! list(csv.reader(fileobj)) возвращает список списков. Вот почему! Спасибо, что помогли мне понять это! :) - person Fabian; 28.04.2018

Вы открываете файлы, а не закрываете их. Всякий раз, когда вы используете .open() без .close(), могут возникнуть ошибки.

Всегда предпочтительнее использовать диспетчер контекста, как в последнем примере.

with open('filename.ext', mode='somemodeR\W'), так как это автоматически закрывает его, и вам не нужно беспокоиться о том, чтобы вручную закрывать файл каждый раз, когда вы его открываете.

person elvirmuslic    schedule 27.04.2018