#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.
./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. Да, это было действительно полезно. Спасибо