Seite 1 von 1
Datei umcodieren
Verfasst: Dienstag 8. Oktober 2013, 16:58
von kruphi
Moin moin,
ich muss eine Datei umcodieren. Diese ist im Format UTF-8 codiert und ich muss diese in Latin-1 codiert haben.
Ist es sinnvoll die Datei dafür komplett einzulesen und dann neu zu speichern?
Bleiben dabei alle Zeichen komplett so erhalten?
Vielen Dank
Re: Datei umcodieren
Verfasst: Dienstag 8. Oktober 2013, 17:10
von BlackJack
@kruphi: Ja das ist sinnvoll, es sei denn die Datei(en) würden nicht in den Arbeitsspeicher passen. Ob alle Zeichen erhalten bleiben hängt davon ab ob die Originaldatei nur Zeichen enthält die auch in der Zielkodierung enthalten sind. Also wenn Du Pech hast, dann geht es nicht verlustfrei.
Re: Datei umcodieren
Verfasst: Mittwoch 9. Oktober 2013, 11:32
von kruphi
Ich habe ein paar Versuche jetzt hinter mir.
Ich hatte mir das einfacher vorgestellt.
hier mal einer meiner Versuche.
Code: Alles auswählen
import pickle
file = open("import-utf.txt", "r")
all=pickle.load(file).encode("latin-1")
file.close()
speicher = open("test.dta", "w")
pickle.dump(all, speicher)
speicher.close()
Vielen Dank
Re: Datei umcodieren
Verfasst: Mittwoch 9. Oktober 2013, 12:16
von BlackJack
@kruphi: Wie kommt denn *pickle* da jetzt plötzlich ins Spiel? Das sind keine Textdateien. Selbst die, die nur ASCII-Werte verwenden muss man im Binärmodus öffnen, weil sie sonst kaputt gehen können, beziehungsweise nicht mehr plattformunabhängig sind.
Da können nahezu beliebige Python-Objekte serialisiert drin gespeichert sein, die darf man nicht einfach komplett als Datei umkodieren. Du musst schon wissen was da drin steckt, entpicklen, gezielt die Zeichenketten in den Objekten umkodieren, sofern man da einfach heran kommt, und dann wieder picklen.
Umkodieren bedeutet ausserdem dass man erst mit einer Kodierung dekodiert und dann mit der neuen kodiert. Nur in eine Richtung funktioniert das nicht.
Re: Datei umcodieren
Verfasst: Mittwoch 9. Oktober 2013, 13:25
von /me
kruphi hat geschrieben:Ist es sinnvoll die Datei dafür komplett einzulesen und dann neu zu speichern?
Anders geht es wohl nicht.
Code: Alles auswählen
import io
sourcefile = 'test-utf8.txt'
targetfile = 'test-latin1.txt'
with io.open(sourcefile, mode='r', encoding='UTF-8') as f_in, \
io.open(targetfile, mode='w', encoding='LATIN-1') as f_out:
for line in f_in:
f_out.write(line)
Falls du die Daten allerdings wirklich im pickle-Format vorliegen hast, dann ist der gesamte Ansatz schon falsch.
Re: Datei umcodieren
Verfasst: Mittwoch 9. Oktober 2013, 13:31
von BlackJack
@/me: Natürlich geht es anders, Du machst es doch selber vor. Oder ich habe *komplett einlesen* jetzt falsch gedeutet.

Re: Datei umcodieren
Verfasst: Mittwoch 9. Oktober 2013, 14:34
von /me
BlackJack hat geschrieben:@/me: Natürlich geht es anders, Du machst es doch selber vor. Oder ich habe *komplett einlesen* jetzt falsch gedeutet.

Gelesen wird die Datei natürlich schon komplett, allerdings müssen natürlich nicht alle Teile gleichzeitig im Hauptspeicher sein.
Re: Datei umcodieren
Verfasst: Mittwoch 9. Oktober 2013, 18:01
von Hyperion
@me: Wieso benutzt Du das ``open`` aus dem ``io``-Modul? Ist mir gerade nicht klar.
Re: Datei umcodieren
Verfasst: Mittwoch 9. Oktober 2013, 18:19
von /me
Hyperion hat geschrieben:@me: Wieso benutzt Du das ``open`` aus dem ``io``-Modul? Ist mir gerade nicht klar.
Kompatibilität zwischen Python 2 und Python 3.
Re: Datei umcodieren
Verfasst: Donnerstag 10. Oktober 2013, 04:29
von Dami123
Könnte man nicht die eingebauten Funktion "encode" und "decode" verwenden?
Code: Alles auswählen
with open(os.path.join("file"), "r+") as datafile:
content = datafile.read().decode("utf-8").encode("latin-1")
datafile.seek(0)
datafile.write(content)
Re: Datei umcodieren
Verfasst: Donnerstag 10. Oktober 2013, 07:13
von BlackJack
@Dami123: Das sind Methoden und keine Funktionen, aber ja, das könnte man auch.
Aber das was Du mit der Datei da machst ist kaputt. Das könnte man beim umgekehrten Weg machen, aber so herum wird bei jeder Datei die diese Umwandlung tatsächlich *braucht* am Ende der Datei noch etwas von der alten Datei stehen was da nicht hingehört.
Und das ``os.path.join("file")`` ist sinnfrei.
Re: Datei umcodieren
Verfasst: Donnerstag 10. Oktober 2013, 07:39
von Sirius3
@Dami123: Außerdem solltest Du die Datei binär öffnen ("rb") um eine Interpretation des Inhalts zu verhindern, da das Umwandeln von Bytes in Text schon durch das "decode" geschieht.
Re: Datei umcodieren
Verfasst: Freitag 11. Oktober 2013, 00:31
von Dami123
@BlackJack
Was ist den eine geeignete Variante um eine Datei zu lesen und schreiben, ohne sie zweimal zu öffnen?
@Sirius3
Ok.
Re: Datei umcodieren
Verfasst: Freitag 11. Oktober 2013, 01:16
von cofi
Warum haelst du es denn fuer erstrebenswert die Datei nur einmal zu oeffnen?
Das Problem, das BlackJack beschreibt, hat nicht wirklich etwas damit zu tun, dass man die Datei zweimal oeffnen sollte. Vielmehr wird beim Oeffnen mit dem 'w' Flag eine moeglicherweise existierende Datei geloescht/ueberschrieben.
Ein `file.truncate(0)` nach dem `file.seek(0)` hat das gleiche Ergebnis. Alternativ auch ein `file.truncate()` nach dem Schreiben.
Kommt es aber zu irgendeinem Fehler, hat man unwiederbringlich Datensalat. Darum sollte man in eine andere Datei schreiben und die danach gegebenenfalls zur urspruenglichen Datei umbenennen.
Re: Datei umcodieren
Verfasst: Freitag 11. Oktober 2013, 12:24
von Dami123
Alles klar, denke werde weiterhin die zweimal öffnen Methode nutzen.
Re: Datei umcodieren
Verfasst: Montag 14. Oktober 2013, 09:56
von kruphi
Wollte mich nur noch einmal bedanken!
Hat wunderbar geklappt. Habe mich jetzt auch noch einmal mit pickle beschäftigt....
Vielen Kruphi