2010-12-12 10 views
6

questo dovrebbe essere molto semplice domanda, per la quale non ho trovato risposta da parte di Google di ricerca: Come chiudere handle di file aperto da pyPDF "PdfFileReader" ClasseCome chiudere gestire pyPDF file di classe "PdfFileReader"

Ecco frammento:

import os.path 
from pyPdf import PdfFileReader 

fname = 'my.pdf' 
input = PdfFileReader(file(fname, "rb")) 

os.rename(fname, 'my_renamed.pdf') 

che genera l'errore [32]

Grazie

+0

Esegui Windows e 'my_renamed.pdf' esiste prima di rinominare? – khachik

+0

Sì, ho dimenticato di menzionare che eseguo Windows 7 a 32 bit e uso Python 2.5. Il file "my_renamed.pdf" non esiste – romor

+0

@romor "32" significa che non può accedere al file perché è in uso. Prova a chiudere 'fname' manualmente (dopo averlo letto) e poi rinomina. – khachik

risposta

4

Il sistema operativo impedisce che un file venga rinominato, mentre qualcos'altro ha Aperto. Questa è una buona cosa (tm).

L'istruzione Python with chiuderà automaticamente il file dopo aver finito di leggerlo/manipolarlo.

with open(fname, "rb") as f: 
    input = PdfFileReader(f, "rb")) 

os.rename(fname, 'my_renamed.pdf') 

Se siete ancora in Python 2.5, dovrete fare un import speciale:

from __future__ import with_statement 

Python 2.6 e soprattutto avere con abilitato di default.

3

Se davvero deve accesso questo dall'oggetto PdfFileReader (vale a dire: se non hai un riferimento al file oggetto da soli), è possibile utilizzare reader.stream.close()

Nota che il PdfFileReader avrà bisogno un oggetto file aperto per accedere al contenuto del pdf (non carica tutto in memoria dall'inizio), quindi chiudi il file solo quando hai finito con il lettore.

1

vorrei sugest per gestire il file aperto dalla PdfFileReader

il codice sarà:

import os.path 
from pyPdf import PdfFileReader 

fname = 'my.pdf' 
fh = file(fname, "rb") 
input = PdfFileReader(fh) 

fh.close() 
os.rename(fname, 'my_renamed.pdf') 
0

utilizzando invece input=PdfFileReader(file(fname, "rb")) creare un flusso di input come questo

inputStream=file(fname, "rb") 
    input=PdfFileReader(inputStream) 

e quando il lavoro è finito, usa inputStream.close() allora sarai in grado di chiamarlo tramite il pacchetto os

Problemi correlati