Seite 1 von 1

Python Textverarbeitung - UnicodeDecodeError - enumerate

Verfasst: Freitag 21. September 2018, 00:13
von pvb89
Hallo,

ich habe ~10.000 txt Datei die aus einem eMail Export stammen. Nun versuche ich in jeder Datei die dritte Zeile zu löschen. Dazu habe ich mir auch schon etwas gebastelt, was mir jedoch bei einigen Dateien einen Error ausspuckt (bei ~2 von 10 Dateien).

Es geht mir hier um eine schnelle Lösung, da es nur ein Mittel zum Zweck ist (Datenaufbereitung für predictiv analytics). Daher entschuldigt bitte die simplen Fragen, ich bin sonst auch ein befürworteter alles zu verstehen und durch selbstständige Recherche es zu lösen.

1. Bräuchte ich Hilfe zum UniCodeError
2. ggfs. Tipps oder Example wie ich in Zeile 1 nach einem String suche und falls dieser gefunden wird, die Datei in einen separaten Ordner speichert.

Code: Alles auswählen

import os
import itertools

for root, dirs, files in os.walk("./data"): 
	for test in files:
		with open(os.path.join("./data", test)) as f, open('out.txt', 'w') as fo:
			for linenum, line in enumerate(f, start=1):
				if linenum != 2:
					fo.write(line)
		os.rename("out.txt",test)
Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "script.py", line 7, in <module>
    for linenum, line in enumerate(f, start=1):
  File "C:\Users\behren\AppData\Local\Programs\Python\Python37\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 5121: character maps to <undefined>
================ READY ================
Position 5121 im Dokument = 'Abroad” am'

Re: Python Textverarbeitung - UnicodeDecodeError - enumerate

Verfasst: Freitag 21. September 2018, 07:23
von __deets__
Wenn du eh nur auf Zeilen aus bist, lies die Daten als Bytes ein (‘b’ als modifier zu open) und ignorier das encoding.

Re: Python Textverarbeitung - UnicodeDecodeError - enumerate

Verfasst: Freitag 21. September 2018, 09:53
von __blackjack__
Wobei sich mir hier schon noch zwei Fragen stellen auch wenn eine davon für *diesen* Arbeitsschritt nicht nicht relevant ist: Liegen die Dateien in unterschiedlichen Kodierungen vor und ist auch mit gespeichert in *welcher*? Das kann bei der Analyse dann vielleicht wichtig werden. Und das zweite ist: was ist diese zweite Zeile die da entfernt wird. Falls das ein Header einer RFC2822 formatierten Nachricht ist, möchte man vielleicht an der Stelle auch prüfen ob man da a) tatsächlich den richtigen entfernt, und b) ob der tatsächlich nur eine Zeile lang ist.

Re: Python Textverarbeitung - UnicodeDecodeError - enumerate

Verfasst: Freitag 21. September 2018, 17:00
von pvb89
__deets__ hat geschrieben: Freitag 21. September 2018, 07:23 Wenn du eh nur auf Zeilen aus bist, lies die Daten als Bytes ein (‘b’ als modifier zu open) und ignorier das encoding.
Danke ! Nu läuft es rund !
__blackjack__ hat geschrieben: Freitag 21. September 2018, 09:53 Wobei sich mir hier schon noch zwei Fragen stellen auch wenn eine davon für *diesen* Arbeitsschritt nicht nicht relevant ist: Liegen die Dateien in unterschiedlichen Kodierungen vor und ist auch mit gespeichert in *welcher*? Das kann bei der Analyse dann vielleicht wichtig werden. Und das zweite ist: was ist diese zweite Zeile die da entfernt wird. Falls das ein Header einer RFC2822 formatierten Nachricht ist, möchte man vielleicht an der Stelle auch prüfen ob man da a) tatsächlich den richtigen entfernt, und b) ob der tatsächlich nur eine Zeile lang ist.
Das sind gute Überlegungen und ich danke Dir für Deine Tipps. Es wird aber eine Quick&Dirty Lösung, da es nur als Mittel zum Zweck dient.