J'ai 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 3.5, j'obtiens:
TypeError: a bytes-like object is required, not 'str'
erreur sur la dernière ligne (le code de recherche de modèle).
J'ai essayé d'utiliser la .decode()
fonction de chaque côté de la déclaration, j'ai également essayé:
if tmp.find('some-pattern') != -1: continue
- en vain.
J'ai pu résoudre presque tous les problèmes 2: 3 rapidement, mais cette petite déclaration me dérange.
result = requests.get
et j'essaye de le fairex = result.content.split("\n")
. Je suis un peu confus par le message d'erreur car il semble impliquer qu'ilresult.content
s'agit d'une chaîne et.split()
nécessite un objet de type octets .. ?? ("un objet de type octets est requis, pas 'str"').Réponses:
Vous avez ouvert le fichier en mode binaire:
Cela signifie que toutes les données lues dans le fichier sont renvoyées en tant
bytes
qu'objets, nonstr
. Vous ne pouvez alors pas utiliser une chaîne dans un test de confinement:Vous devez utiliser un
bytes
objet pour effectuer un test à latmp
place:ou ouvrez le fichier en tant que fichier texte à la place en remplaçant le
'rb'
mode par'r'
.la source
'r'
vs , basculant entre les comportements binaires et les fichiers texte (comme la traduction de nouvelles lignes et sur certaines plateformes, la façon dont le marqueur EOF est traité). Le fait que la bibliothèque (fournissant la fonctionnalité d'E / S par défaut dans Python 3 mais également disponible dans Python 2) décode désormais également les fichiers texte par défaut est le vrai changement.'rb'
io
'b'
indicateur que lorsque je devais travailler avec des fichiers binaires sous DOS / Windows (car le binaire est le POSIX par défaut). Il est bon qu'il y ait un double objectif lors de l'utilisationio
dans 3.x pour l'accès aux fichiers.Vous pouvez encoder votre chaîne en utilisant
.encode()
Exemple:
la source
Comme cela a déjà été mentionné, vous lisez le fichier en mode binaire puis créez une liste d'octets. Dans votre suite pour boucle vous comparez une chaîne à des octets et c'est là que le code échoue.
Le décodage des octets lors de l'ajout à la liste devrait fonctionner. Le code modifié doit se présenter comme suit:
Le type d'octets 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:
la source
Vous devez passer de wb à w:
à
Après avoir changé cela, l'erreur disparaît, mais vous ne pouvez pas écrire dans le fichier (dans mon cas). Donc après tout, je n'ai pas de réponse?
La source: Comment supprimer ^ M
Le passage à «rb» m'apporte l'autre erreur: io.UnsupportedOperation: write
la source
pour ce petit exemple: import socket
l'ajout du "b" avant "GET http://www.py4inf.com/code/romeo.txt HTTP / 1.0 \ n \ n" a résolu mon problème
la source
Utilisez la fonction encode () avec la valeur String codée en dur donnée dans un guillemet simple.
Ex:
OU
la source
Vous avez ouvert le fichier en mode binaire:
Le code suivant lancera une TypeError: un objet de type octets est requis, pas 'str'.
Le code suivant fonctionnera - vous devez utiliser la fonction decode ():
la source
pourquoi ne pas essayer d'ouvrir votre fichier sous forme de texte?
De plus, voici un lien pour python 3.x sur la page officielle: https://docs.python.org/3/library/io.html Et voici la fonction ouverte: https://docs.python.org/3 /library/functions.html#open
Si vous essayez vraiment de le gérer comme un binaire, pensez à encoder votre chaîne.
la source
J'ai eu cette erreur lorsque j'essayais de convertir un char (ou une chaîne) en
bytes
, le code était quelque chose comme ça avec Python 2.7:C'est la voie de Python 2.7 traite les caractères unicode.
Cela ne fonctionnera pas avec Python 3.6, car
bytes
nécessite un argument supplémentaire pour l'encodage, mais cela peut être peu délicat, car un encodage différent peut produire un résultat différent:Dans mon cas, j'ai dû utiliser
iso_8859_1
lors du codage des octets afin de résoudre le problème.J'espère que cela aide quelqu'un.
la source