2016-05-02 6 views
-1

Ich versuche, eine Liste von Dicts zu Datei, die in Latin-1 codiert ist, zu drucken. Jedes Feld ist durch ein ASCII-Zeichen 254 und dem Ende der Leitung getrennt werden sollten 20.Verwenden von ASCII-Nummer zu Zeichen in Python

ASCII-Zeichen sein, Wenn ich versuche, um ein Zeichen zu verwenden, die größer als 128 ist I „UnicodeDecodeError: 'ascii' codec can't decode byte 0xfe in position 12: ordinal not in range(128)

bekommen Dies ist mein aktueller Code Könnte mir jemand helfen, wie man ein ASCII-Zeichen 254 codiert und ein Ende der Zeile ASCII-Zeichen 20 bei Verwendung von DictWriter hinzufügt.

Dank mein Code:

with codecs.open("test.dat", "w", "ISO-8859-1") as outputFile: 

     delimiter = (chr(254)) 
     keys = file_dict[0].keys() 
     dict_writer = csv.DictWriter(outputFile, keys, delimiter=delimiter) 
     dict_writer.writeheader() 
     for value in file_dict: 
      dict_writer.writerow(value) 
+0

Öffnen Sie die Datei mit 'file = codecs.open ("test.txt", "w",„utf -8 ")". – EbraHim

+0

Verwenden Sie Python 3, wenn Sie können. – mhawke

+0

Können Sie bestätigen, dass Sie ein Python2.x verwenden? Python2 und 3 haben verschiedene Idiome hier ... –

Antwort

0

ASCII nur Zeichencodes 0-127 enthält.

Codes im Bereich 128-255 sind nicht in ASCII definiert, sondern nur in Codecs, die es erweitern, wie ANSI, latin-1 oder alle Unicodes.

In Ihrem Fall ist es wahrscheinlich irgendwie Doppel-Codierung der Zeichenfolge, die fehlschlägt.

Es funktioniert, wenn Sie den integrierten Standard-open Funktion ohne einen Codec Angabe verwenden:

with open("test.dat", "w") as outputFile: # omit the codec stuff here 
    delimiter = (chr(254)) 
    keys = file_dict[0].keys() 
    dict_writer = csv.DictWriter(outputFile, keys, delimiter=delimiter) 
    dict_writer.writeheader() 
    for value in file_dict: 
     dict_writer.writerow(value) 
+0

Sie sind fast richtig. Da das Codecs-Modul eine Unicode-Ausgabe erwartet, versucht es zunächst, die Byte-Zeichenkette, die chr (254) Zeichen enthält, zu konvertieren und schlägt mit "UnicodeDecodeError" fehl, weil die Standardkonvertierung ascii ist. Es ist also kein doppeltes Kodierungsproblem, sondern die von Codecs geforderte Konvertierung in Unicode. –

+0

Aber ich brauche die Datei in ISO-8859-1, wenn ich die Codecs entferne, wie sonst kann ich die Datei verschlüsseln. Durch Hinzufügen von encode zu writerow wird Nonetype cannpt encodiert. Wie kann ich auch "END OF LINE" als ASCII-Zeichen hinzufügen ?! – sipra287

Verwandte Themen