10
votes

Python: problème Unicode

Je suis en train de décoder une chaîne que je pris du fichier:

file = open ("./Downloads/lamp-post.csv", 'r')
data = file.readlines()
data[0]


1 commentaires

Ma réponse fonctionne sans l'erreur. Mais cela dépend si vous souhaitez ignorer ou remplacer les caractères non récupérés.


3 Réponses :


3
votes

edit fort>

puisque vous avez posté 2.7 Il s'agit de la solution 2.7: p> xxx pré>

Ignorer les caractères non rectobles: p>

file = open("./Downloads/lamp-post.csv", "r")
data = [line.decode("utf-16", "ignore") for line in file]


7 commentaires

Dans [21]: fichier = ouvert ("./downloads/lamamp-post.csv", 'r') dans [22]: DATA = [LINE.DECODE () pour la ligne dans Fichier] --------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --- ----------------- Traceback (appel le plus récent dernier) / Utilisateurs / oleg / dans () : "ASCII" Codec ne peut pas décoder octet 0xff en position 0: ordinal non dans la plage (128) dans [23]: données = [ligne.decode () pour la ligne dans le fichier]


Ohh, voulez-vous ignorer ces caractères non valides ou les remplacer? Édité ma réponse en supposant remplacement.


Dans Python 3, des fichiers sont ouverts en mode Unicode par défaut. Donc, ils n'auront pas de méthode de décodage.


Je décide le bowvote. Mais il y a toujours une meilleure façon de python 3: utilisez l'argument de codage pour OUVERT. Ouvrir ("Téléchargements / Lampe-Post.csv", encodage = "utf-16") .


Les données étranges ne semblent pas être changées ... E.G. Je vois le même tableau de données d'appel UTF-16


@Oleg: Êtes-vous sûr que c'est 2,7? /pt/local/lib/python2.5 / ?


Voir la mise à jour sur la question ... Auch c'est 2.5: Argent: ~ Oleg $ ipython Python 2.5.1 (R251: 54863, 22 février 2008, 16:52:17) Tapez "Copyright", "Crédits" ou "Licence" pour plus informations.



17
votes

Ceci ressemble à des données UTF-16. Alors essayez xxx

édition (pour votre mise à jour): essayez de décoder l'ensemble du fichier à la fois, c'est-à-dire xxx

le problème est que Les pauses de la ligne dans UTF-16 sont "\ n \ x00", mais en utilisant Readlines () sera divisée à la "\ n", laissant le caractère "\ x00" pour la ligne suivante.


1 commentaires

Étrange, il échoue pour la prochaine ligne:



9
votes

Ce fichier est un fichier codé UTF-16-LE, avec un bom initial.

import codecs

fp= codecs.open("a", "r", "utf-16")
lines= fp.readlines()


1 commentaires

-1 Balderdash. >>> Raw = '\ xff \ xfek \ x00e \ x00y \ x00w \ x00o \ x00r \ x00d \ x00' >>> Raw.Decode ('utf_16le') u '\ ufeffkeyword' >>> Raw.Decode ('utf_16 ') u'keyword' >>>