python: utiliser io.BufferedReader sur un flux obtenu avec open ()?
Je veux utiliser un tampon de flux parce que je veux utiliser un peek()
de la méthode de jeter un regard vers l'avant, mais utiliser mon flux avec une autre méthode qui attend un fichier objet semblable. (Je ne l'utiliserais seek()
mais peut-être la poignée d'ambiance dans l'I/O qui ne prend pas en charge l'accès aléatoire.)
Mais ce test échoue:
AttributeError: 'fichier' objet n'a pas d'attribut "_checkReadable'
import sys
import io
srcfile = sys.argv[1]
with open(srcfile, 'rb') as f:
fbuf = io.BufferedReader(f)
print fbuf.read(20)
Ce qui se passe et comment puis-je résoudre ce problème? J'ai pensé BufferedReader était destiné à de la mémoire tampon d'un ruisseau. Si oui, pourquoi ne le open()
fonction retourne pas quelque chose qui est compatible avec elle?
source d'informationauteur Jason S
Vous devez vous connecter pour publier un commentaire.
Par les regards de votre
print
déclaration, vous êtes à l'aide de Python 2. Sur cette version, unfile
n'est pas un argument valable pour laBufferedReader
constructeur:Vous devez utiliser
io.open
à la place:Si vous faites cela, il n'y a pas explicitement de l'envelopper dans un
BufferedReader
puisque c'est exactement ce queio.open
renvoie par défaut:Voir ses docs pour plus de détails; il y a un
buffering
argument qui contrôle la mise en mémoire tampon.En Python 3,
open is io.open
de sorte que les deux bibliothèques d'e/S ont été fusionnés en un seul retour. Il sembleio
a été ajouté à la version 2.6 de Python surtout pour la compatibilité ascendante.Vous pouvez définir la quantité de tampon en octets par l'adoption de la
tampon
argument ouvrir:C'est un
BufferedReader
:Notez que, par défaut, il est tamponné à
1
ligne de mise en mémoire tampon.En Python2, si vous devez utiliser
file
objet retourné paropen
(ou, par exemple, fourni par certaines routines du module qui vous ne pouvez pas modifier), vous pouvez utiliser le descripteur de fichier obtenus parfileno()
pourio.FileIO
constructeur, puis passerio.FileIO
objet deio.BufferedReader
constructeur.Donc, vous avez un exemple de code peut être réécrit comme suit: