2017-06-22 6 views
0

Donc j'essaye de créer un wrapper de texte que j'utilise ensuite readlines() pour un unittest. Voici ma tentative, mais quand je le lance les readlines() ne retourne rien:Comment créer et écrire dans un textiowrapper et readlines

output = io.BytesIO() 
wrapper = io.TextIOWrapper(
output, 
encoding='cp1252', 
line_buffering=True, 
) 

wrapper.write('Text1') 
wrapper.write('Text2') 
wrapper.write('Text3') 
wrapper.write('Text4') 

for line in wrapper.readlines(): 
    print(line) 

Que dois-je changer pour obtenir cette sortie:

Text1 
Text2 
Text3 
Text4 
+0

Oui la nouvelle réponse a fonctionné. Il me semble qu'il me manquait l'appel 'wrapper.seek (0,0)' pour démarrer le flux. – EliSquared

Répondre

1

En savoir plus sur TextIOWrapper class dans la documentation du module io :

un flux de texte sur un tampon BufferedIOBase binary stream.

Modifier: utiliser la fonction seek:

seek(offset[, whence]) 

Modifier la position de l'octet courant de décalage donné. offset est interprété par rapport à la position indiquée par whence. La valeur par défaut pour whence est SEEK_SET. Les valeurs de whence sont:

  • SEEK_SET ou 0 - début du flux (par défaut); le décalage doit être nul ou positif
  • SEEK_CUR ou 1 - position du courant; le décalage peut être négatif
  • SEEK_END ou l'extrémité 2 du flux; le décalage est généralement négatif

Renvoie la nouvelle position absolue.

Nouveauté de la version 3.1: Les constantes SEEK_*.

Nouveauté de la version 3.3: Certains systèmes d'exploitation pouvaient prendre en charge des valeurs supplémentaires , telles que os.SEEK_HOLE ou os.SEEK_DATA. Les valeurs valides pour un fichier peuvent dépendre de son ouverture en mode texte ou binaire.

Effectuez les opérations suivantes ont formulé des commentaires extrait de code:

import io, os 
output = io.BytesIO() 
wrapper = io.TextIOWrapper(
output, 
encoding='cp1252', 
# errors=None,   # defalut 
# newline=None,  # defalut 
line_buffering=True, 
# write_through=False # defalut 
) 

wrapper.write('Text1\n') 
wrapper.write('Text2\n') 
wrapper.write('Text3\n') 
# wrapper.flush()    # If line_buffering is True, flush() is implied 
           ## when a call to write contains a newline character. 

wrapper.seek(0,0)    # start of the stream 
for line in wrapper.readlines(): 
    print(line) 

Le reste de ma réponse originale:

print(output.getvalue())   # for gebugging purposes 

print(wrapper.write('Text4\n')) # for gebugging purposes 

# for line in wrapper.read(): 
for line in output.getvalue().decode('cp1252').split(os.linesep): 
    print(line) 

Sortie:

==> D:\test\Python\q44702487.py 
b'Text1\r\nText2\r\nText3\r\n' 
6 
Text1 
Text2 
Text3 
Text4 

==> 

+0

Le problème est que l'objet de 'output.getvalue().decode ('cp1252') 'n'a pas la propriété' readlines() 'et si je fais' wrapper.readlines() 'rien n'est retourné. Est-il possible de modifier l'objet afin que vous puissiez utiliser readlines()? Je ne veux pas changer la fonctionnalité de mon code pour que l'unittest fonctionne. – EliSquared