2016-05-29 12 views
4

Ich habe ein Problem mit dem Codierungsproblem in Python (IPython Notebook). Da diese Art von Problemen sehr häufig und einfach ist, kann ich es immer noch nicht wirklich beheben.Python: Got xa0 statt Leerzeichen in CSV und kann nicht entfernen oder konvertieren

Ich habe eine CSV Datei hier, wie Sie sehen können, haben wir viele '\ xa0' und andere '\ n' Zeichen in dieser Datei.

I

verwendet
with io.open(train_fname) as f: 
for line in f: 
    line = line.encode("ascii", "replace") 

Aber es funktioniert nicht, ich die folgende Ausgabe immer erhalten.

Stellen Sie sich vor, Sie könnten sagen, Sie wissen was, keine Sanktionen, keine ewigen Anhörungen über die Vorschriften der IEAA, keine Verheimlichung der freundlichen Atomenergie mehr. \ xa0Du hast 2 Tage bis; \ xa0i.e. \ xa0let in den Inspektoren, beenden Sie die Zivilisten zu töten.

Ich habe versucht, andere Methoden wie

line.replace(u"\xa0", " ") Es ist auch nicht funktioniert, habe ich versucht, auch alle Arten von Codierung diese CSV-Datei in meinem Text bearbeiten zu öffnen, erhabener Text. Ich habe versucht Windows-1252, UTF-8 und alle anderen Kodierungen, aber ich bekomme immer \ Xa0 ist mein Text bearbeiten, wenn Sie diese CSV-Datei anzeigen.

Bedeutet dies das

\ xa0

bereits in dieser CSV-Datei als Eingabetext geschrieben? Es ist kein Problem der Python-Kodierung? Wenn es in diesem Fall ist, warum kann ich die Methode replace nicht verwenden, um diese Zeichenfolge einfach zu ersetzen? Das \ xa0 zeigt an, dass die Datei codiert ist, in welcher codieren? Dies bedeutet, dass diese Datei in utf-8 geschrieben ist, aber ich habe versucht, sie in ascii oder anderen Fällen zu öffnen?

Ich suchte viele Fragen, aber sie scheinen nicht viel Hilfe zu bieten. Bitte frag mich, ob meine Frage nicht klar ist. Vielen Dank!

`

+1

Die 'replace()' Methode funktioniert nicht direkt. –

+0

Welche Codierung ist Ihre Eingabedatei? –

Antwort

5

Die \xa0, die Sie sehen, ist eine Folge von 4 Zeichen: \xa0. Alle diese Zeichen sind normales ASCII, also kein Zeichensatzproblem hier.

Offenbar sollen Sie diese Escape-Sequenzen interpretieren. Ihre Idee, sie durch ein Leerzeichen zu ersetzen, ist gut, aber Sie müssen auf den umgekehrten Schrägstrich achten. Wenn es in einem Zeichenfolgenliteral angezeigt wird, muss es \\ geschrieben werden.Also versuchen Sie dies:

line.replace("\\xa0", " ") 

oder:

line.replace(r"\xa0", " ") 

Die r vor dem String bedeutet jedes Zeichen buchstäblich, auch ein Backslash zu interpretieren.


Beachten Sie, dass die Daten in der CSV-Datei voller Inkonsistenzen sind. Beispiele:

  • \n bedeutet wahrscheinlich einen Zeilenumbruch.
  • \\n erscheint auch, und es bedeutet wahrscheinlich auch einen Zeilenumbruch.
  • \xa0 ist ein in ISO-8859-1 kodiertes, nichtbrechendes Leerzeichen.
  • \xc2\xa0 ist ein in UTF-8 kodiertes, nichtbrechendes Leerzeichen.
  • \\xc2\\xa0 erscheint auch, mit der gleichen Bedeutung.
  • \\\\n erscheint auch.
  • Um sinnvolle Inhalte aus dieser Datei zu erhalten, sollten Sie die Escape-Sequenzen wiederholt interpretieren, bis sich nichts ändert. Versuchen Sie anschließend, die resultierende Bytefolge als UTF-8 zu interpretieren. Wenn es funktioniert, gut. Wenn nicht, interpretiere es als Codepage 1252 (was eine Obermenge von ISO-8859-1 ist).

    +0

    Vielen Dank! Es klappt! –

    +0

    Ich habe einige Anmerkungen zum Inhalt der CSV-Datei hinzugefügt. Viel Spaß dabei. :) –

    2

    Die von \xa0 vertreten Charakter ist U+00A0: NO-BREAK SPACE.

    Ihre Zeichenfolge enthält jedoch nicht das Zeichen "\xa0"; es enthält den -Literaltext\xa0 (d. h. die Python-Zeichenfolge "\\xa0") zusammen mit einer Anzahl anderer codierter Zeichen. (Die Datei in einem Texteditor öffnen und Sie werden sehen, was ich meine.) Sie haben die string_escape Codierung verwenden können diese, um die Zeichen zu konvertieren sie repräsentieren:

    for line in f: 
        line = line.decode("string_escape") 
        … 
    
    +0

    Vielen Dank! das funktioniert! –

    Verwandte Themen