Datei binär / String / Hilfe

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
jihi
User
Beiträge: 14
Registriert: Montag 29. August 2005, 20:53
Wohnort: Hessen
Kontaktdaten:

Hallo,
bin ganz neu in Python und habe folgendes Problem:

ich habe eine Wörterbuch Datei. Darin sind immer 31 Bytes ein Eintrag, wobei wenn das Wort nicht die 31 Bytes lang ist, die restlichen Bytes mit dem Wert 00hex aufgefüllt sind.

1. Wie lese ich jetzt diese Wörter in eine Liste ein?
mit file.read(31) ?

2. Wie erkenn ich das Dateiende?
3. Wie schneide ich die überflüssigen 00hex am Ende ab?


4. Wie findet man denn in der Doku überhaupt passende Funktionen, für das was man sucht??

Vielen Dank für eure Mühen =)
BlackJack

jihi hat geschrieben:ich habe eine Wörterbuch Datei. Darin sind immer 31 Bytes ein Eintrag, wobei wenn das Wort nicht die 31 Bytes lang ist, die restlichen Bytes mit dem Wert 00hex aufgefüllt sind.

1. Wie lese ich jetzt diese Wörter in eine Liste ein?
mit file.read(31) ?
Damit liest Du einen Eintrag ein. Also musst Du das in einer Schleife machen.
2. Wie erkenn ich das Dateiende?
Wenn die Datei zuende ist, dann liefert `read()` eine leere Zeichenkette.
3. Wie schneide ich die überflüssigen 00hex am Ende ab?
`rstrip()` Methode auf Zeichenketten.
4. Wie findet man denn in der Doku überhaupt passende Funktionen, für das was man sucht??
Kommt drauf an was man sucht. :wink:

In Deinem Fall ist's die Doku zu `file` bzw. `open` und Zeichenketten.

Ungetestet:

Code: Alles auswählen

def read_words(fileobj):
    result = list()
    while True:
        word = fileobj.read(31)
        if not word:
            break
        result.append(word.rstrip('\x00'))
    return result
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

jihi hat geschrieben:4. Wie findet man denn in der Doku überhaupt passende Funktionen, für das was man sucht??
Schau mal in die FAQ http://www.pythonwiki.de/PythonDeForum/Faq den Punkt "Wo finde ich Informationen zum Python-Befehl XY?"

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
jihi
User
Beiträge: 14
Registriert: Montag 29. August 2005, 20:53
Wohnort: Hessen
Kontaktdaten:

Ahh, Danke Danke

werds gleich mal testen =)

Mein Problem ist ja, dass ich garnet weiss wie der passende Befehl heisst.
jihi
User
Beiträge: 14
Registriert: Montag 29. August 2005, 20:53
Wohnort: Hessen
Kontaktdaten:

ich wollt die Datei jetzt so umspeichern, das die Einträge nicht eine konstante Länge, sonder ein Byte die Länge angibt, und dann der Eintrag kommt.
°aber wie schreibe und lese ich in Python einzelne Bytes?
°muss ich die immer erst in einen String umwandeln, das ich die mit write schreiben kann?
°binascii Lib, bin ich da richtig?

°wie bring ich denn noch print dazu äüö auch als solche und nicht als '\\x05' auszugeben?

danke
...ihr seid Spitze!
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

jihi hat geschrieben:°binascii Lib, bin ich da richtig?
Ich glaube struct.pack() ist besser:
http://www.python.org/doc/current/lib/m ... truct.html

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
jihi
User
Beiträge: 14
Registriert: Montag 29. August 2005, 20:53
Wohnort: Hessen
Kontaktdaten:

Aber da find ich nur Integer, keine einzelnen Bytes :?:
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ähm... Ich bin da jetzt auch kein Fachman, aber da steht: pack( fmt, v1, v2, ...) Dabei steht "fmt" für Format und das kannst du aus der Tabelle nehmen...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
jihi
User
Beiträge: 14
Registriert: Montag 29. August 2005, 20:53
Wohnort: Hessen
Kontaktdaten:

ja, und in der Tabelle gibts nur Int, dieses Byte ganz oben, das versteh ich nicht, weil da pack nur 1 Argument nimmt??
BlackJack

Man kann das auch mit dem `struct` Modul lösen, aber wenn es sich nur um ein einzelnes Byte, also ein Zeichen in einer Zeichenkette handelt, dann reichen die Funktionen `chr()` und `ord()` um zwischen Zahl und Zeichen hin und her zu wandeln.

Aber ist es wirklich nötig die Daten von einem Binärformat in ein anderes umzuwandeln wenn es sich um Textdaten handelt? Wieso nicht einfach ein Eintrag pro Zeile in einer ganz normalen Textdatei?

Zur Ausgabe von Sonderzeichen: Wenn Du irgendwas mit \xa6 oder so siehst, dann hast Du höchstwahrscheinlich nicht die Zeichenkette ausgegeben sondern die `repr()` Form davon. Alles ausserhalb von ASCII kann etwas komplizierter werden, weil sich alle beteiligten (Eingabedatei, Python-Interpreter, Shell, Terminalprogramm) über die Kodierung der Daten einig sein müssen.
Antworten