Python – Unicode / Ascii Probleme finden

Ich bin csv.reader, um Info aus einem sehr langen Blatt zu ziehen. Ich arbeite an diesem Datensatz und dann verwende ich das xlwt-Paket, um mir eine praktikable Excel-Datei zu geben.

Allerdings bekomme ich diesen Fehler:

UnicodeDecodeError: 'ascii' Codec kann das Byte 0x92 nicht in Position 34 decodieren: Ordinal nicht im Bereich (128)

Meine Frage an euch alles ist, wie kann ich genau finden, wo dieser Fehler in meinem Datensatz ist? Auch gibt es einen Code, den ich schreiben kann, der durch meinen Datensatz schauen wird und herausfinden, wo die Probleme liegen (weil einige Datensätze ohne den obigen Fehler laufen und andere Probleme haben)?

3 Solutions collect form web for “Python – Unicode / Ascii Probleme finden”

Die Antwort ist ganz einfach: Sobald Sie Ihre Daten aus Ihrer Datei lesen, konvertieren Sie es in Unicode mit der Verschlüsselung Ihrer Datei und behandeln die UnicodeDecodeError Ausnahme:

try: # decode using utf-8 (use ascii if you want) unicode_data = str_data.decode("utf-8") except UnicodeDecodeError, e: print "The error is there !" 

Das wird dich vor vielen Schwierigkeiten retten; Sie müssen sich keine Sorgen um Multibyte-Zeichencodierung machen, und externe Bibliotheken (einschließlich xlwt) werden einfach das richtige Thing machen, wenn sie es schreiben müssen.

Python 3.0 wird es zwingend erforderlich, die Codierung eines Strings anzugeben, also ist es eine gute Idee, es jetzt zu tun.

Das csv Modul unterstützt keine Unicode- und Nullzeichen. Sie können sie vielleicht ersetzen, indem Sie so etwas wie dies tun (Ersetzen Sie 'utf-8' mit der Codierung, die Ihre CSV-Daten codiert sind):

 import codecs import csv class AsciiFile: def __init__(self, path): self.f = codecs.open(path, 'rb', 'utf-8') def close(self): self.f.close() def __iter__(self): for line in self.f: # 'replace' for unicode characters -> ?, 'ignore' to ignore them y = line.encode('ascii', 'replace') y = y.replace('\0', '?') # Can't handle null characters! yield y f = AsciiFile(PATH) r = csv.reader(f) ... f.close() 

Wenn du die Positionen der Zeichen finden willst, die du nicht vom CSV-Modul handhaben kannst, kannst du zB:

 import codecs lineno = 0 f = codecs.open(PATH, 'rb', 'utf-8') for line in f: for x, c in enumerate(line): if not c.encode('ascii', 'ignore') or c == '\0': print "Character ordinal %s line %s character %s is unicode or null!" % (ord(c), lineno, x) lineno += 1 f.close() 

Alternativ können Sie auch diesen CSV-Opener nutzen, den ich geschrieben habe, was Unicode-Zeichen verarbeiten kann:

 import codecs def OpenCSV(Path, Encoding, Delims, StartAtRow, Qualifier, Errors): infile = codecs.open(Path, "rb", Encoding, errors=Errors) for Line in infile: Line = Line.strip('\r\n') if (StartAtRow - 1) and StartAtRow > 0: StartAtRow -= 1 elif Qualifier != '(None)': # Take a note of the chars 'before' just # in case of excel-style """ quoting. cB41 = ''; cB42 = '' L = [''] qMode = False for c in Line: if c==Qualifier and c==cB41==cB42 and qMode: # Triple qualifiers, so allow it with one L[-1] = L[-1][:-2] L[-1] += c elif c==Qualifier: # A qualifier, so reverse qual mode qMode = not qMode elif c in Delims and not qMode: # Not in qual mode and delim L.append('') else: # Nothing to see here, move along L[-1] += c cB42 = cB41 cB41 = c yield L else: # There aren't any qualifiers. cB41 = ''; cB42 = '' L = [''] for c in Line: cB42 = cB41; cB41 = c if c in Delims: # Delim L.append('') else: # Nothing to see here, move along L[-1] += c yield L for listItem in openCSV(PATH, Encoding='utf-8', Delims=[','], StartAtRow=0, Qualifier='"', Errors='replace') ... 

Sie können sich auf Code-Snippets in der Frage unten, um einen csv-Reader mit Unicode-Encoding-Support zu bekommen:

  • General Unicode / UTF-8 Unterstützung für CSV-Dateien in Python 2.6
Python ist die beste Programmiersprache der Welt.