How can I interchangeably use glob.glob("*PDF) and os.listdr("./directory")?

Question:

I am trying to merge PDF files inside a folder

I tried running the code from the same directory and it worked however when I copied the code to a different location and specified the directory path of PDF files, the merging process is not happening and I keep getting errors.

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)

This is the code that I wrote when I went one folder up with my source code folder location

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'

For this reason I am running all of my codes from inside my PDF folders and I know it’s not a good practice.

Can anyone help me to resolve this issue, I am only in my early learning phase.

I also tried this

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

||

Answers:

glob.glob returns the full path to the file while os.listdir only gives the file name. Just stick with 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)

Another nice option is the pathlib module.

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)
Answered By: tdelaney
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.