web-dev-qa-db-fra.com

TypeError: élément de séquence 0: instance de str attendue, octets trouvés

for line in fo:
    line = " ".join(line.split())
    line = line.strip()

Je reçois une erreur 

line = ''.join(line.split())
TypeError: sequence item 0: expected str instance, bytes found

cela fonctionne bien dans python 2.x, mais ne fonctionne pas sur 3.4 suggère gentiment une solution appropriée

14
Muhammad Umer

' ' est une chaîne que vous appelez sa méthode join avec une séquence d'octets. Comme indiqué dans la documentation, en python-3.x:

str.joinRetour une chaîne qui est la concaténation des chaînes dans le iterableiterable. Un TypeError sera levé s'il y en a valeurs non-chaîne dans iterable, y compris octets objets. Le séparateur entre éléments est la chaîne fournissant cette méthode.

Mais dans ce cas, étant donné que vous utilisez des objets octets, vous ne pouvez pas utiliser les méthodes liées à str. L'objet octet lui-même est fourni avec une méthode join() qui peut être utilisée de la même manière que str.join. Vous pouvez également utiliser io.BytesIO ou effectuer une concaténation sur place avec un objet bytearray. Comme mentionné dans la documentation, les objets bytearray sont modifiables et disposent d'un mécanisme de surallocation efficace.

Vous pouvez donc simplement ajouter un préfixe b à la chaîne vide pour en faire un objet octet:

line = b" ".join(line.split())

De plus, si votre fichier contient des chaînes, vous pouvez simplement l’ouvrir dans un mode str ('r') au lieu d’octet ('rb').

with open("input.txt", "r") as f:
    # Do something with f

Notez que malgré la séparation entre les objets str et byte dans python-3.x, vous ne disposez que de str. Vous pouvez le voir en vérifiant le type d'une chaîne avec le préfixe b:

In [2]: type(b'')
Out[2]: str

Et c’est ce qui fait que l’extrait suivant fonctionne:

"".join([b'www', b'www'])
25
Kasrâmvd

Vous devriez ajouter une ligne Lines = str (lines)

avant d’exécuter la commande pour éviter les erreurs. De cette façon, vous convertissez initialement en chaîne elle-même.

0
user3126530

Si vous êtes venu chercher une solution pour rejoindre une classe personnalisée implémentée en C/C++, la méthode la plus simple consiste à ajouter une méthode de jointure à la classe elle-même et à créer une liaison à python.

Par exemple, une classe pouvant avoir soit une liste, soit une carte qui devrait être joignable, par exemple le code dans pybind11 ressemblerait à ceci:

py::class_<Data> _data(m, "Data");
_data.def(py::init<>())
    .def("join", [] (Data &d, const char *j = ' ') {
        std::string ret;
        if (d.isObject())
            for (auto &o: d.object())
                ret += o.first + j;
        else if (d.isList())
            for (auto &o: d.list())
                ret += o.stringValue() + j;
        return ret;
    })

Ensuite, en python, il suffit d'appeler la méthode join pour la classe

data.join('_')
0
Adnan Y