2016-06-04 9 views
1

Ich versuche zu lesen von Felixou Wortliste und schreibe alle Wörter, die> = 8 Zeichen sind, in eine neue Datei. HierUnicodeEncodeError beim Lesen einer Datei

ist der Code -

def main(): 
    with open("rockyou.txt", encoding="utf8") as in_file, open('rockout.txt', 'w') as out_file: 
     for line in in_file: 
      if len(line.rstrip()) < 8: 
       continue 
      print(line, file = out_file, end = '') 
     print("done") 

if __name__ == '__main__': 
    main() 

Einige Worte sind nicht utf-8.

Traceback (most recent call last): File "wpa_rock.py", line 10, in <module> main() File "wpa_rock.py", line 6, in main print(line, file = out_file, end = '') File "C:\Python\lib\encodings\cp1252.py", line 19, in encode return codecs.charmap_encode(input,self.errors,encoding_table)[0] UnicodeEncodeError: 'charmap' codec can't encode character '\u0e45' in position 0: character maps to <undefined>

aktualisieren

def main(): 
with open("rockyou.txt", encoding="utf8") as in_file, open('rockout.txt', 'w', encoding="utf8") as out_file: 
    for line in in_file: 
     if len(line.rstrip()) < 8: 
      continue 
     out_file.write(line) 
    print("done") 

if __name__ == '__main__': 
    main()``` 

Traceback (most recent call last): File "wpa_rock.py", line 10, in <module> main() File "wpa_rock.py", line 3, in main for line in in_file: File "C:\Python\lib\codecs.py", line 321, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 933: invali d continuation byte

+1

Es ist ein Tippfehler. Es sollte "utf-8" anstelle von "utf8" sein. – Arpan

+0

Ich weiß nicht, ob es das ist. Beide Ergebnisse werden zu demselben Fehler verwendet. –

+0

Sie müssen ein ungültiges Zeichen an dieser Position haben. Sie sollten die Datei anzeigen, die Sie versuchen zu lesen. – Arpan

Antwort

1

Ihr UnicodeEncodeError: 'charmap' Fehler während -out_file (in print()) zu schreiben.

standardmäßig open() verwendet locale.getpreferredencoding(), die ANSI-Codepage unter Windows ist (wie cp1252), die nicht alle Unicode-Zeichen und '\u0e45' Charakter insbesondere darstellen kann. cp1252 ist eine Ein-Byte-Codierung, die höchstens 256 unterschiedliche Zeichen darstellen kann, aber es gibt eine Million Unicode-Zeichen (1114111). Es kann nicht alle repräsentieren.

Pass encoding, die beispielsweise alle gewünschten Daten darstellen kann, encoding='utf-8' müssen (wie @robyschek suggested) arbeiten -wenn Ihren Code liest utf-8 Daten ohne Fehler dann sollte der Code in der Lage sein, die Daten zu schreiben, zu utf-8 verwenden.


Ihre UnicodeDecodeError: 'utf-8' Fehler treten beim Lesen in_file (for line in in_file). Nicht alle Bytefolgen sind gültig utf-8, z. B. os.urandom(100).decode('utf-8') kann fehlschlagen. Was zu tun ist, hängt von der Anwendung ab.

Wenn Sie erwarten, dass die Datei als utf-8 codiert wird; Sie könnten errors="ignore"open() Parameter übergeben, um gelegentlich ungültige Bytefolgen zu ignorieren. Oder Sie könnten some other error handlers depending on your application verwenden.

Wenn die tatsächliche Zeichencodierung in der Datei anders ist, sollten Sie die tatsächliche Zeichencodierung übergeben. bytes selbst haben keine Codierung, dass Metadaten aus einer anderen Quelle mit (obwohl some encodings are more likely than others: chardet can guess) zum Beispiel, wenn der Inhalt der Datei ist ein HTTP-Körper sieht dann A good way to get the charset/encoding of an HTTP response in Python

Manchmal ist eine gebrochene Software erzeugen kann meist utf-8-Byte-Sequenzen kommen sollte einige Bytes in einer anderen Kodierung. bs4.BeautifulSoup can handle some special cases. Sie könnten auch try ftfy utility/library und sehen, ob es in Ihrem Fall z. B. ftfy may fix some utf-8 variations hilft.

+0

Aktualisiert die Frage. –