Wie eine Datei in eine Liste laden?

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
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Hmmm.., ich möchte die Datei in eine Liste, es ist eine Binärdatei.
Wie geht das?

Code: Alles auswählen

laenge=os.path.getsize("cpc.bin")

f=open("cpc.bin", "rb")
wie in eine Liste??? = f.read(laenge)
Danke.

Gruss
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

funkheld hat geschrieben:

Code: Alles auswählen

laenge=os.path.getsize("cpc.bin")

f=open("cpc.bin", "rb")
wie in eine Liste??? = f.read(laenge)
Danke.

Gruss
Preisfrage für 50 Punkte: Wie lautete doch gleich das Idiom für das Öffnen von dateien?

@Frage (die man üblicherweise durchaus auch noch mal explizit im Thread selber ausschreiben darf, anstatt sich auf dem Titel auszuruhen...):
Lass Dir doch mal den Typen von f.read() ausgeben! Dann überlegst Du Dir, ob der Typ für die gewünschte Operation genügt.

Ansonsten schaust Du Dir mal die list() Funktion an und guckst, was die als Parameter erwartet.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

"s = f.read(laenge)"

Ist "s" kein String???

Gruss
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

funkheld hat geschrieben:"s = f.read(laenge)"

Ist "s" kein String???

Gruss
Das kann man ganz prima mit der type-Funktion herausfinden.

Edit: Das Abfragen der Dateilänge ist übrigens noch immer überflüssig.
Das Leben ist wie ein Tennisball.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

funkheld hat geschrieben:"s = f.read(laenge)"

Ist "s" kein String???
s ist bei deinem Beispiel in der Tat ein Stringobjekt. Was hat das jetzt mit deiner Frage nach der Liste zu tun?

Wie fügst du denn sonst Objekte einer Liste hinzu?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

ein bisschen offtopic:
Das Bestimmen der Dateigröße vor dem Einlesen des Inhaltes ist nicht nur überflüssig, sondern sogar gefährlich, zumindest so wie Du es dann weiter benutzt. Was, wenn ein Prozess zwischen Grössenbestimmung der Datei (2kB) und Auslesen diese öffnet und auf 1kB eindampft? Später erzeugst Du ein char-Array hieraus und greift auf den Inhalt über Index zu. Während Du von 2kB ausgehst, ist das char-Array nur 1kB groß. ---> Pufferüberlauf

Wie wärs damit?

Code: Alles auswählen

with open('bla', 'rb') as f:
    s = f.read()  # ohne Groesse, liesst komplette Datei ein
size = len(s)     # ja, Strings haben eine Laenge
print s[0]        # und Indexzugriff, der evtl. fuer Deine Zwecke reicht
s_in_c = ctypes.create_string_buffer(s, size) # nicht explizit nullterminiert
s_in_c = ctypes.create_string_buffer(s)       # nullterminiert, Pufferueberlauf droht fuer falsche Groesse
's_in_c' und 'size' kannst Du nun Deinen DLL-Funktionen übergeben und hast Zugriff auf den kompletten Inhalt ohne falsche Puffergröße. Du kannst natürlich trotzdem 'read()' eine zu lesende Größe übergeben. Wichtig ist die anschliessende Überprüfung der Stringgröße, da 'read()' auch weniger zurückgeben kann.

<rant>
Das sind absolute Basics, die auch in anderen Programmiersprachen zu beachten sind. Ich komme hier ins Zweifeln, was Deine Programmierervergangenheit angeht. ;)
</rant>

@Listenproblem:
Siehe Python-Dokumentation zum Erstellen einer Liste.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

jerch hat geschrieben:Das Bestimmen der Dateigröße vor dem Einlesen des Inhaltes ist nicht nur überflüssig, sondern sogar gefährlich, zumindest so wie Du es dann weiter benutzt.
Das habe ich ihm auch schon mal erklärt...
Das Leben ist wie ein Tennisball.
Antworten