Seite 1 von 1
unicode und 8 Bit Ascii
Verfasst: Freitag 24. März 2006, 15:49
von mbierenfeld
Hallo zusammen,
ich habe eine 16Bit unicode Datei die muss nun in eine 8 Bit ascii datei gewandelt werden irgendwie funtzt dat ned mit
Code: Alles auswählen
infile = open ("DTABAND0028")
content = infile.read ()
infile.close ()
ascii = content.decode('ascii')
outfile = open ("DTABAND0028.txt", "w")
outfile.write (ascii)
outfile.close ()
kann jemand einem genervten noch schnell am freitag auf die spruenge helfen
Verfasst: Freitag 24. März 2006, 16:11
von jens
Schau dir mal codecs.open() an:
http://wiki.python.de/Von_Umlauten%2C_U ... _Encodings (ganz unten)
http://wiki.python.de/Tags/Unicode
Im Übrigen sieht dein Quellencode recht komisch aus. Man macht keine Leerzeichen: bla () -> bla()
Schon klar nur
Verfasst: Freitag 24. März 2006, 16:24
von mbierenfeld
Danke fuer die Antwort,
ich habe es nun so drin. Ist immer noch nicht das was ich brauche.
Das problem ist die 16 bittige Darstellung versus die 8 bittige Darstellung innerhalb der Datei
ich habe es nun so drin
Code: Alles auswählen
outfile = codecs.open ("DTABAND0028.txt", "w", "utf-8")
outfile.write (content)
outfile.close ()
in der datei ist aber als hex wert fuer zBsp "0128"
0x00 0x30 0x00 0x31 0x32 0x00 0x38
sprich
0x00 0x30 = 0
0x00 0x31 = 1
0x00 0x32 = 2
0x00 0x38 = 8
ich brauche 0x30 0x31 0x32 0x38. Also 8 Bit Zeichensatz
Liebe gruesse
michael
Verfasst: Freitag 24. März 2006, 16:38
von gerold
Hi Michael!
Wenn du eine 16-Bit Unicodedatei hast, warum öffnest du sie dann mit der Einstellung "utf-8"? Da liegen Meilen (8 Bit) dazwischen.
Ah, ich sehe. Das ist der Code zum Speichern.
Was funktioniert nicht, wenn du mit utf-16 liest und mit utf-8 speicherst?
Lass uns auch mal sehen, wie du die Datei liest.
mfg
Gerold
Verfasst: Freitag 24. März 2006, 16:46
von Hannes-Spz
Lustig, das kenne ich irgendwoher...
aber versuchs doch mal mit sowas änhlichem:
Code: Alles auswählen
from string import replace
neuer_string = replace(Alter_String, "\x00", "")
es ersetzt einfach alle kästchen (0x00) durch ein leeres, eigentlich nicht
vorhandenes zeichen!
probiers aus
Verfasst: Freitag 24. März 2006, 16:51
von gerold
Falls deine Quelle "utf-16" ist, dann funktioniert dieser Code sicher:
Code: Alles auswählen
import codecs
f_in = codecs.open("quelle.txt", mode='r', encoding="utf-16")
f_out = codecs.open("ziel.txt", mode='w', encoding="utf-8")
for line in f_in:
f_out.write(line)
f_in.close()
f_out.close()
mfg
Gerold
Verfasst: Freitag 24. März 2006, 16:59
von gerold
Sch...! Schon wieder ein Fehler von mir. Du willst ja gar nicht nach UTF-8 sondern nach ASCII konvertieren.
Dann musst du es damit probieren. Ich habe noch zwei Alternativen zu ASCII hinzugefügt, da ASCII mit Sicherheit fehlschlägt, wenn ein Umlaut im Text ist.
Code: Alles auswählen
f_out = codecs.open("ziel.txt", mode='w', encoding="ascii")
f_out = codecs.open("ziel.txt", mode='w', encoding="iso-8859-15")
f_out = codecs.open("ziel.txt", mode='w', encoding="iso-8859-1")
mfg
Gerold
Verfasst: Freitag 24. März 2006, 19:52
von jens
Da wäre auch noch eine Frage von mir... Was soll mit Zeichen, die nicht in ASCII rein passen, passieren???
Verfasst: Freitag 24. März 2006, 22:10
von BlackJack
Genau, da ist ein Fehler im Titel dieser Diskussion: Es gibt kein 8-Bit ASCII. ASCII ist ein 7-Bit Code.
Verfasst: Freitag 24. März 2006, 23:11
von Joghurt
Eine ganz, ganz böse Lösung wäre diese hier
Code: Alles auswählen
inf = open("DATEI", "rb")
outf = open("DATEI.txt", "wb")
while 1:
buf = inf.read(8192) # oder was auch immer
if not buf:
break
outf.write(buf[1::2])
Dieses speichert jedes zweite Byte in die neue Datei
Verfasst: Freitag 24. März 2006, 23:48
von modelnine
Uuuh.
Warum wollten einfach alle Leute \x00 irgendwie rauskriegen? Damit hat man, zumindest wenn Umlaute im Original waren, in der Ausgabe nur noch Grütze (zumindest da wo die Umlaute waren). gerold hat doch eine richtige und gute Lösung mittels der input- und output-codec-Schnittstellen gepostet?
*juchhei*
Verfasst: Montag 27. März 2006, 09:15
von mbierenfeld
Sonnige Gruesse aus München,
quick and dirty but "Das ist genau das was ich brauche"
Code: Alles auswählen
inf = open("DATEI", "rb")
outf = open("DATEI.txt", "wb")
while 1:
buf = inf.read(8192) # oder was auch immer
if not buf:
break
outf.write(buf[1::2])
Die bösen Daten sollen dann von einem Host weiterverarbeitet werden. Der kann keine 16Bit Texte. Nur 7Bit EBCDIC.
Grüsse aus der Steinzeit
Michael
Verfasst: Montag 27. März 2006, 09:37
von jens
btw. bei
http://de.wikipedia.org/wiki/EBCDIC steht das EBCDIC 8-Bit wäre und verschiedene Codepages hat...
Und für diejenigen die sich auch fragen was buf[1::2] macht:
Code: Alles auswählen
buf = "1234567890"
print buf[1::2]
buf = "x[x1x2x3x4x5x6x7x8x9x0x]x"
print buf[1::2]
Ausgabe:
24680
[1234567890]
siehe:
http://docs.python.org/lib/typesseq.html#l2h-157
s[i:j:k] slice of s from i to j with step k
wie wahr
Verfasst: Montag 27. März 2006, 11:52
von mbierenfeld
Wir haben eine Codepage aus Niederoestereich bei uns auf dem Host. Ich glaube selbst die IBM weiss nicht mehr, dass es die mal gab.
danke nochmal
Verfasst: Montag 27. März 2006, 22:00
von BlackJack
Ich würde trotzdem nicht den "quick'n'dirty" Weg wählen.
recode kennt zum Beispiel ``EBCDIC-AT-DE``.
schon klar
Verfasst: Dienstag 28. März 2006, 09:13
von mbierenfeld
Der quick and dirty wird nur benutzt um 16 Bit auf 8 Bit "runterzubrechen".
Die Umwandlung von UTF-8 oder sonstwas nach ebcdic geht dann mit den "normalen" Routinen ich habe dazu eine Codepage cp273.py erstellen lassen und verwende sie ganz normal mit "encode"
gruesse
michael
Re: schon klar
Verfasst: Mittwoch 29. März 2006, 06:34
von BlackJack
mbierenfeld hat geschrieben:Der quick and dirty wird nur benutzt um 16 Bit auf 8 Bit "runterzubrechen".
Die Umwandlung von UTF-8 oder sonstwas nach ebcdic geht dann mit den "normalen" Routinen ich habe dazu eine Codepage cp273.py erstellen lassen und verwende sie ganz normal mit "encode"
Warum dann diese "brutale" Methode? Kannst Du nicht einfach ganz sauber UTF-16 dekodieren und dann als cp273 wieder kodieren?
Verfasst: Mittwoch 29. März 2006, 13:56
von mbierenfeld
Hallo,
ich brauche die Daten
* sowohl auf dem Host (EBCDIC)... Aber ich denke das immer noch 16Bit / Zeichen verwendet werden nur halt dann nach EBCDIC.
* als auch auf dem SAP-System. Und selbst SAP kommt nicht mit 16 Bit / Zeichen Dateien zurecht.
obwohl das blöde Ding sie selbst geschrieben hat.
Also die quick and dirty brauch ich auf jeden Fall. Ist aber nicht schlimm weil im Zusammenhang mit SAP alles ein Hack ist
Grüße
Michael