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
' '
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.join
Retour 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'])
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.
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('_')