Python Textverarbeitung - UnicodeDecodeError - enumerate

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
pvb89
User
Beiträge: 2
Registriert: Donnerstag 20. September 2018, 23:49

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'
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du eh nur auf Zeilen aus bist, lies die Daten als Bytes ein (‘b’ als modifier zu open) und ignorier das encoding.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
pvb89
User
Beiträge: 2
Registriert: Donnerstag 20. September 2018, 23:49

__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.
Antworten