2010-04-16 3 views
2

PdfFileReader lit le contenu d'un fichier pdf pour créer un objet.façons peu coûteux d'ajouter chercher à un objet filetype

Je demande le pdf à partir d'un cdn via urllib.urlopen(), cela me fournit un fichier comme objet, qui n'a pas de recherche. PdfFileReader, utilise cependant chercher.

Quelle est la manière simple de créer un objet PdfFileReader à partir d'un pdf téléchargé via url.

Maintenant, que puis-je faire pour éviter d'écrire sur le disque et de le relire via file().

Merci d'avance.

+0

Notez que si vous l'avez * enregistré * sur le disque et ouvert, vous le feriez avec 'open', pas' file'. –

+0

Mike: 'PdfFileReader (fichier ('aaa.pdf'))' fonctionne bien. –

+0

Oui, mais il est préférable d'utiliser 'open()' sur 'file()' - ils prennent les mêmes arguments. Voir la note sur http://docs.python.org/library/functions.html#file – Amber

Répondre

1

Il n'y a pas vraiment un moyen peu coûteux et prêt à utiliser pour cela. Le plus simple est de lire toutes les données et de les placer dans un objet StringIO. Cela exige toutefois que vous lisiez tout d'abord, ce qui peut être ou ne pas être ce que vous voulez.

Si vous voulez quelque chose qui se lit uniquement comme nécessaire, puis stocke ce qui a été lu (ou peut-être juste une partie de ce qui a été lu), alors vous devrez l'écrire vous-même. Vous pouvez voir la source du module StringIO (ou le module io, en Python 2.6) pour quelques exemples.

+0

Non, Non, Non. Ce n'est pas un fichier de 100 Mo. Je veux juste quelque chose qui fonctionne. Si possible, à peu de frais. Pas en écrivant un module d'E/S. :) –

+0

Donc, utilisez la première suggestion: StringIO est votre ami. –

1

Vous pouvez utiliser la méthode .read() pour lire l'intégralité des données du fichier, puis créer votre propre objet semblable à un fichier (probablement via StringIO) pour y accéder.

+0

Je ne peux pas faire 'fichier (urllib.urlopen ('abc.pdf'). Read())' non plus. Je reçois "TypeError: l'argument file() 1 doit être une chaîne encodée sans NULL octets, pas str" –

+0

'file()' n'est pas une fonction de conversion comme 'dict()' ou 'list()' - elle prend la même chose arguments comme 'open()' (un nom de fichier, et un mode optionnel + taille de la mémoire tampon). Vous ne pouvez pas simplement passer le contenu du fichier et obtenir un objet fichier. – Amber

1

Je suppose que vous pouvez optimiser ici prématurément.

La plupart des systèmes modernes mettent les fichiers en mémoire cache pendant une période de temps significative avant de les vider sur le disque, donc si vous écrivez les données dans un fichier temporaire, relisez-le puis fermez et supprimez le fichier. qu'il n'y a pas de trafic de disque significatif (à moins qu'il ne soit réellement de 100 Mo). Vous pouvez utiliser tempfile.TemporaryFile() qui crée un fichier temporaire qui est automatiquement supprimé lorsqu'il est fermé, ou tempfile.SpooledTemporaryFile() qui le conserve explicitement en mémoire jusqu'à ce qu'il dépasse une taille particulière.

Questions connexes