unicode und 8 Bit Ascii

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

unicode und 8 Bit Ascii

Beitragvon mbierenfeld » 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
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Freitag 24. März 2006, 16:11

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() :lol:

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mbierenfeld
User
Beiträge: 39
Registriert: Donnerstag 9. Dezember 2004, 22:02
Wohnort: Muenchen

Schon klar nur

Beitragvon mbierenfeld » 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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » 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. :wink:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

Beitragvon Hannes-Spz » Freitag 24. März 2006, 16:46

Lustig, das kenne ich irgendwoher... :wink:

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 :D
[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]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » 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.
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » 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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » 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???

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Beitragvon 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.
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » 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:

Beitragvon modelnine » 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

*juchhei*

Beitragvon mbierenfeld » 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
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 27. März 2006, 09:37

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mbierenfeld
User
Beiträge: 39
Registriert: Donnerstag 9. Dezember 2004, 22:02
Wohnort: Muenchen

wie wahr

Beitragvon mbierenfeld » 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
BlackJack

Beitragvon BlackJack » Montag 27. März 2006, 22:00

Ich würde trotzdem nicht den "quick'n'dirty" Weg wählen. recode kennt zum Beispiel ``EBCDIC-AT-DE``.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]