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.
mbierenfeld
User
Beiträge: 39 Registriert: Donnerstag 9. Dezember 2004, 22:02
Wohnort: Muenchen
Freitag 24. März 2006, 15:49
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
mbierenfeld
User
Beiträge: 39 Registriert: Donnerstag 9. Dezember 2004, 22:02
Wohnort: Muenchen
Freitag 24. März 2006, 16:24
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
gerold
Python-Forum Veteran
Beiträge: 5555 Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:
Freitag 24. März 2006, 16:38
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
Hannes-Spz
User
Beiträge: 123 Registriert: Sonntag 7. August 2005, 22:42
Freitag 24. März 2006, 16:46
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
[size=85]"Unsere Situation ist immer die eines schwarzen Mannes der in einem schwarzen Keller einen schwarzen Hut sucht, den es vielleicht gar nicht gibt." Sir Karl R. Popper[/size]
gerold
Python-Forum Veteran
Beiträge: 5555 Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:
Freitag 24. März 2006, 16:51
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
Zuletzt geändert von
gerold am Freitag 24. März 2006, 17:01, insgesamt 1-mal geändert.
gerold
Python-Forum Veteran
Beiträge: 5555 Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:
Freitag 24. März 2006, 16:59
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
jens
Python-Forum Veteran
Beiträge: 8502 Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:
Freitag 24. März 2006, 19:52
Da wäre auch noch eine Frage von mir... Was soll mit Zeichen, die nicht in ASCII rein passen, passieren???
BlackJack
Freitag 24. März 2006, 22:10
Genau, da ist ein Fehler im Titel dieser Diskussion: Es gibt kein 8-Bit ASCII. ASCII ist ein 7-Bit Code.
Joghurt
User
Beiträge: 877 Registriert: Dienstag 15. Februar 2005, 15:07
Freitag 24. März 2006, 23:11
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
modelnine
User
Beiträge: 670 Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:
Freitag 24. März 2006, 23:48
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?
--- Heiko.
mbierenfeld
User
Beiträge: 39 Registriert: Donnerstag 9. Dezember 2004, 22:02
Wohnort: Muenchen
Montag 27. März 2006, 09:15
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
mbierenfeld
User
Beiträge: 39 Registriert: Donnerstag 9. Dezember 2004, 22:02
Wohnort: Muenchen
Montag 27. März 2006, 11:52
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
mbierenfeld
User
Beiträge: 39 Registriert: Donnerstag 9. Dezember 2004, 22:02
Wohnort: Muenchen
Dienstag 28. März 2006, 09:13
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
BlackJack
Mittwoch 29. März 2006, 06:34
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?
mbierenfeld
User
Beiträge: 39 Registriert: Donnerstag 9. Dezember 2004, 22:02
Wohnort: Muenchen
Mittwoch 29. März 2006, 13:56
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