2010-12-12 2 views
6

cela devrait être question très simple, pour que je ne pouvais pas trouver réponse par recherche Google: Comment fermer le fichier poignée ouverte par pypdf « PdfFileReader » ClasseComment fermer pypdf « PdfFileReader » poignée fichier de classe

Voici extrait:

import os.path 
from pyPdf import PdfFileReader 

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

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

qui soulève erreur [32]

Merci

+0

Exécutez-vous des fenêtres et existe-t-il 'my_renamed.pdf' avant de renommer? – khachik

+0

Oui, j'ai oublié de mentionner que je cours Windows 7 32 bits et utilise Python 2.5. Le fichier 'my_renamed.pdf' n'existe pas – romor

+0

@romor '32' signifie que vous ne pouvez pas accéder au fichier car il est en cours d'utilisation. Essayez de fermer 'fname' manuellement (après l'avoir lu), puis renommez-le. – khachik

Répondre

4

Le système d'exploitation empêche un fichier d'être rebaptisé en quelque chose d'autre l'a ouvert C'est une bonne chose (tm). L'instruction with de Python fermera automatiquement le fichier après l'avoir lu/manipulé.

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

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

Si vous êtes toujours sur Python 2.5, vous devrez faire une importation spéciale:

from __future__ import with_statement 

Python 2.6 et au-dessus ont avec activé par défaut.

3

Si vous avez vraiment devez y accéder depuis l'objet PdfFileReader (qui est la suivante: si vous n'avez pas une référence au fichier vous-même objet), vous pouvez utiliser reader.stream.close()

Notez que le PdfFileReader aura besoin un objet de fichier ouvert pour accéder au contenu du pdf (il ne tire pas tout en mémoire depuis le début), donc fermez le fichier seulement quand vous avez fini avec le lecteur.

1

Je sugest pour gérer le fichier ouvert de la PdfFileReader

Votre code sera:

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

au lieu d'utiliser input=PdfFileReader(file(fname, "rb")) créer un flux d'entrée comme celui-ci

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

et Lorsque le travail est terminé, utilisez inputStream.close() puis vous pourrez l'appeler via le paquet