2010-08-16 4 views
1

J'ajoute des données d'un fichier csv dans une base de données. Si j'ouvre le fichier CSV, certaines des entrées contiennent des puces - je peux les voir. file dit qu'il est codé comme ISO-8859.Travailler sur l'encodage de fichier: Je connais la chaîne, connaître le caractère, quel est le codage?

$ file data_clean.csv 
data_clean.csv: ISO-8859 English text, with very long lines, with CRLF, LF line terminators 

je l'ai lu dans la manière suivante et le convertir de l'ISO-8859-1 en UTF-8, ma base de données nécessite.

row = [unicode(x.decode("ISO-8859-1").strip()) for x in row] 
    print row[4]  
    description = row[4].encode("UTF-8") 
    print description 

Cela me donne les éléments suivants:

'\xa5 Research and insight \n\xa5 Media and communications' 
¥ Research and insight 
¥ Media and communications 

Pourquoi la puce \ de xa5 comme symbole convertissent le yen?

Je suppose que je l'interprète comme un mauvais encodage, mais quel est le bon codage dans ce cas? Ce n'est pas cp1252 non plus.

Plus généralement, existe-t-il un outil où vous pouvez spécifier (i) la chaîne (ii) le caractère connu, et trouver le codage?

Répondre

0

Vous pouvez essayer

iconv -f latin1 -t utf8 data_clean.csv 

si vous le savez est en effet iso-latin-1

Bien que dans iso-latin-1 \ xA5 est en effet un ¥

Edit: En fait, cette semble être un problème sur Mac, en utilisant Word ou similaire et Arial (?) et l'impression ou la conversion au format PDF. Quelques problèmes sur les polices et quoi d'autre. Peut-être que vous devez d'abord masser le fichier de manière explicite. Sonne familier?

1

Plus généralement, est-il un outil où vous pouvez spécifier la chaîne (i) (ii) connu caractère, et découvrez l'encodage?

Vous pouvez facilement écrire un en Python. (exemples utilisent la syntaxe 3.x.)

import encodings 

ENCODINGS = set(encodings._aliases.values()) - {'mbcs', 'tactis'} 

def _decode(data, encoding): 
    try: 
     return data.decode(encoding) 
    except UnicodeError: 
     return None 

def possible_encodings(encoded, decoded): 
    return {enc for enc in ENCODINGS if _decode(encoded, enc) == decoded} 

Donc, si vous savez que votre puce est U + 2022, puis

>>> possible_encodings(b'\xA5', '\u2022') 
{'mac_iceland', 'mac_roman', 'mac_turkish', 'mac_latin2', 'mac_cyrillic'} 
+0

Intéressant - merci. – AP257

Questions connexes