À l'aide de io.BufferedReader sur un flux obtenus 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?
- Il est intéressant. Bien que nous ayons les mêmes versions (2.7.x), nous obtenons légèrement différents messages d'erreur.
- Je l'ai trouvé. Il y a un commentaire dans io.py comme """la Méthode des descriptions et des implémentations par défaut sont héritées de la version C cependant.""" C'est donc en fonction de c ou versions de l'OS.
- Ce n'est pas spécifiques aux systèmes d'exploitation. Mon Python 2.6.7 se plaint
_checkReadable
ainsi, alors que mon 2.7.2 se plaintreadable
. Je ne trouve pas l'engager dès maintenant, mais c'était probablement changé cela quelque part entre 2.7.0 et 2.7.2. - double possible de Faire de io.BufferedReader à partir de sys.stdin en Python
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.username
souligné est valide. Ouio.open("/dev/stdin")
si votre plate-forme a ce fichier (mais dans les deux cas, rester à l'écart desys.stdin
).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.BufferedReader(f)
- comme c'est déjà unBufferedReader
il va travailler.io.open
.open
sera de retour d'unefile
, pas unBufferedReader
en 2.x, donc il n'y a pas depeek
méthode.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: