Как я могу взаимозаменяемо использовать glob.glob(«* PDF) и os.listdr («./directory»)?

#python #pdfmerger

#python #pdfmerger

Вопрос:

Я пытаюсь объединить файлы PDF внутри папки

Я попытался запустить код из того же каталога, и это сработало, однако, когда я скопировал код в другое место и указал путь к каталогу файлов PDF, процесс слияния не происходит, и я продолжаю получать ошибки.

 from PyPDF2 import PdfFileMerger
import glob

x = glob.glob("*pdf")
merger = PdfFileMerger()
 
for pdf in x:
    merger.append(open(pdf, 'rb'))
 
with open("result.pdf", "wb") as fout:
    merger.write(fout)
 

Это код, который я написал, когда я поднял одну папку с местоположением папки с исходным кодом

 x = [a for a in os.listdir('./merge_pdf') if a.endswith(".pdf")]
for pdf in x:
    merger.append(open(pdf, 'rb'))
 
with open("./merge_pdf/result.pdf", "wb") as fout:
    merger.write(fout)

--->FileNotFoundError: [Errno 2] No such file or directory: '1.pdf'
 

По этой причине я запускаю все свои коды из своих папок PDF, и я знаю, что это не очень хорошая практика.

Кто-нибудь может помочь мне решить эту проблему, я только на ранней стадии обучения.

Я также пробовал это

 with open("result.pdf", "wb") as fout:
    merger.write("./merge_pdf/" fout)
 

Комментарии:

1. *.pdf это глобус, который выполняет поиск в текущем каталоге, а не в ./merge_pdf .

2. Вы ожидали listdir , что выходные данные будут содержать полные пути к файлам? Он просто дает имена. Вы не можете открыть файл только по его имени, если он находится в другом каталоге.

3. «Ожидали ли вы, что вывод listdir будет включать полные пути к файлам», я был, но теперь я знаю, что это не так, как это работает. Но все же я не знаю, как получить полный путь к файлу для сохранения выходного файла. Кажется, вы знаете мою проблему, не могли бы вы предложить решение.

4. Используется os.path.join() для объединения имени каталога с именем файла.

5. Спасибо, Бармар.

Ответ №1:

glob.glob возвращает полный путь к файлу, os.listdir указывая только имя файла. Просто придерживайтесь glob.

 from PyPDF2 import PdfFileMerger
import glob

x = glob.glob("merge_pdf/*pdf")
merger = PdfFileMerger()
 
for pdf in x:
    merger.append(open(pdf, 'rb'))
 
with open("merge_pdf/result.pdf", "wb") as fout:
    merger.write(fout)
 

Еще один приятный вариант — pathlib модуль.

 from PyPDF2 import PdfFileMerger
from pathlib import Path

dir_path = Path("merge_pdf")
result_pdf = dir_path/"result.pdf"

merger = PdfFileMerger()
 
for pdf in dir_path.glob("*pdf"):
    merger.append(pdf.open('rb'))
 
with result_pdf.open("wb") as fout:
    merger.write(fout)
 

Комментарии:

1. Это было полезно, но все же любопытно, есть ли какой-нибудь способ использовать os.listdir и выполнить эту работу? Как я могу отдельно указать полный путь к файлу?

2. Конечно, вы можете использовать os.listdir… но на самом деле вы просто переопределяете glob. pathlib Модуль инкапсулирует операции с путями в Path классе и является еще одним хорошим вариантом. Что касается отдельного указания пути к файлу, вы хотите, чтобы это было как переменная, или, возможно, аргумент командной строки, или приглашение?

3. Я хочу попробовать указать путь в качестве переменной на этот раз, и после того, как я узнаю, как этого добиться, я буду гибко указывать путь в других формах.

4. В моем втором примере я добавил путь в качестве переменной, но завернул в Path .

5. Да, это было действительно полезно. Спасибо