Détails
TypeError : un objet de type bytes est requis, pas 'str' ; lors de l'écriture dans un fichier en Python3
J’ai très récemment migré vers Py 3.5. Ce code fonctionnait correctement dans Python 2.7 :
with open(fname, 'rb') as f:
lines = [x.strip() for x in f.readlines()]
for line in lines:
tmp = line.strip().lower()
if 'some-pattern' in tmp: continue
# ... code
Après la mise à niveau vers la version 3.5, j'obtiens le :
TypeError: a bytes-like object is required, not 'str'
sur la dernière ligne (le code de recherche de motif).
J'ai essayé d'utiliser la fonction .decode()
de part et d'autre de la déclaration, j'ai également essayé :
if tmp.find('some-pattern') != -1: continue
- sans succès.
J'ai pu résoudre rapidement presque tous les problèmes de 2:3, mais cette petite déclaration me dérange.
497
3
Vous avez ouvert le fichier en mode binaire :
Cela signifie que toutes les données lues dans le fichier sont retournées sous forme d'objets
bytes
et nonstr
. Vous ne pouvez donc pas utiliser une chaîne de caractères dans un test de confinement :Vous devez utiliser un objet
bytes
pour tester le contenu detmp
:ou ouvrir le fichier comme un fichier texte en remplaçant le mode
'rb'
par'r'
.Comme il a déjà été mentionné, vous lisez le fichier en mode binaire et créez ensuite une liste d'octets. Dans la boucle for suivante, vous comparez la chaîne aux octets et c'est là que le code échoue.
Décoder les octets tout en ajoutant à la liste devrait fonctionner. Le code modifié devrait ressembler à ceci :
Le type bytes a été introduit dans Python 3 et c'est pourquoi votre code fonctionnait dans Python 2. Dans Python 2, il n'y avait pas de type de données pour les octets :
pour ce petit exemple : import socket
en ajoutant le "b" ; devant 'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n' ; a résolu mon problème