2016-08-12 7 views
0

Ich habe vor kurzem meine Arbeit als ETL Developer gestartet und als Teil meiner Übung, ich extrahiere Daten aus einer Textdatei mit Rohdaten. Meine Rohdaten sehen so aus, wie im Bild gezeigt.Hinzufügen von Trennzeichen zu einer Textdatei mit Python

Jetzt möchte ich Trennzeichen zu meiner Datendatei hinzufügen. Grundsätzlich möchte ich nach jeder Zeile ein Komma hinzufügen (,). Mein Code in Python sieht so aus.

with open ('new_locations.txt', 'w') as output: 
with open('locations.txt', 'r') as input: 
    for line in input: 
     new_line = line+',' 
     output.write(new_line) 

wo new_locations.txt die Ausgabetextdatei ist, locations.txt sind die Rohdaten.

Allerdings wirft es mir Fehler die ganze Zeit.

UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 3724: character maps to

Wo genau gehe ich falsch?

+0

Können Sie die gesamte Datei ohne diese Fehler lesen? –

+0

@DanielLee Nein Ich kann die gesamte Datei nicht lesen. Ich kann es nur lesen, bis ASCII-Zeichen vorhanden sind. Sobald die anderen Charaktere beginnen, werfen sie einen Fehler. –

Antwort

1

Wenn Sie eine Datei in python 3 in "Text" Modus öffnen Sie dann die Bytes in der Datei zu python (Unicode) Strings Lesen und Schreiben zu konvertieren. Die Standardcodierung ist plattformabhängig, ist jedoch normalerweise UTF-8.

Wenn Sie Latin-1 Encoding-Datei verwendet, sollten Sie öffnen mit

with open('locations.txt', 'r', encoding='latin_1') as input 

sollten Sie wahrscheinlich tun dies auch mit dem Ausgang, wenn Sie die Ausgabe auch in Latin-1 sein wollen.

Längerfristig sollten Sie wahrscheinlich alle Ihre Daten in ein Unicode-Format in den Datendateien konvertieren.

+0

Danke für die Antwort. Das hat wirklich funktioniert. –

0

Wenn Sie also in die Datei schreiben, müssen Sie sie vor dem Schreiben codieren. Wenn Sie googlen, werden Sie viele Ergebnisse finden.

Hier ist, wie es getan werden kann:

output.write(new_line.encode('utf-8'))# or ascii 

Sie können auch ignorieren fragen, welche nicht umgesetzt werden kann, sondern dass wil Verlust von charachter verursacht und kann nicht die gewünschte Ausgabe sein, hier ist, wie das Wille geschehe:

output.write(new_line.encode('ascii','ignore'))# or 'utf-8' 
+0

Hey danke für die Antwort. Allerdings habe ich eine Follow-up-Frage dazu. 'utf-8' funktionierte nicht für mich. 'Latin-1' hat es getan. Nun könnten Rohdaten eine Mischung verschiedener Charaktere sein. Wie mache ich das komplett generisch? Ich möchte nicht zwischen irgendwelchen Charakteren unterscheiden. –

+0

so Latin-1-Codierung wird zusätzliche Unterstützung für Zeichen nicht unterstützt in UTF-8 oder ASCII, es wird nicht sein, dass es alle Char nach Latin-1 ändern wird, nur zu denen, die nicht unterstützt werden. James oben hat einen besseren Weg als ich vorgeschlagen habe. – harshil9968

Verwandte Themen