Estoy abriendo muchos archivos PDF y quiero eliminar los archivos PDF después de que se hayan analizado, pero los archivos permanecen abiertos hasta que el programa termine de ejecutarse. ¿Cómo cierro los PDf que abro usando PyPDF2?

Código:

def getPDFContent(path):
    content = ""
    # Load PDF into pyPDF
    pdf = PyPDF2.PdfFileReader(file(path, "rb"))

    #Check for number of pages, prevents out of bounds errors
    max = 0
    if pdf.numPages > 3:
        max = 3
    else:
        max = (pdf.numPages - 1)

    # Iterate pages
    for i in range(0, max): 
        # Extract text from page and add to content
        content += pdf.getPage(i).extractText() + "\n"
    # Collapse whitespace
    content = " ".join(content.replace(u"\xa0", " ").strip().split())
    #pdf.close()
    return content
4
SPYBUG96 30 oct. 2017 a las 20:38

3 respuestas

La mejor respuesta

Simplemente abra y cierre el archivo usted mismo

f = open(path, "rb")
pdf = PyPDF2.PdfFileReader(f)
f.close()

PyPDF2 .read() es la secuencia que pasa, directamente en el constructor. Entonces, después de la construcción inicial del objeto, puede tirar el archivo.

Un administrador de contexto también funcionará:

with open(path, "rb") as f:
    pdf = PyPDF2.PdfFileReader(f)
do_other_stuff_with_pdf(pdf)
2
Scott 30 oct. 2017 a las 17:47

Al hacer esto:

pdf = PyPDF2.PdfFileReader(file(path, "rb"))

Está pasando una referencia a un identificador, pero no tiene control sobre cuándo se cerrará el archivo.

Debe crear un contexto con el identificador en lugar de pasarlo de forma anónima desde aquí:

Yo escribiría

with open(path,"rb") as f:

    pdf = PyPDF2.PdfFileReader(f)
    #Check for number of pages, prevents out of bounds errors
    ... do your processing
    # Collapse whitespace
    content = " ".join(content.replace(u"\xa0", " ").strip().split())
# now the file is closed by exiting the block, you can delete it
os.remove(path)
# and return the contents
return content
1
Jean-François Fabre 30 oct. 2017 a las 17:45

Sí, está pasando la transmisión a PdfFileReader y puede cerrarla. La sintaxis with es preferible hacer eso por usted:

def getPDFContent(path):
    with open(path, "rb") as f:
        content = ""
        # Load PDF into pyPDF
        pdf = PyPDF2.PdfFileReader(f)

        #Check for number of pages, prevents out of bounds errors
        max = 0
        if pdf.numPages > 3:
            max = 3
        else:
            max = (pdf.numPages - 1)

        # Iterate pages
        for i in range(0, max): 
            # Extract text from page and add to content
            content += pdf.getPage(i).extractText() + "\n"
        # Collapse whitespace
        content = " ".join(content.replace(u"\xa0", " ").strip().split())
        return content
1
de1 30 oct. 2017 a las 17:47