Python liest die Datei nicht ganz

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
campino97
User
Beiträge: 42
Registriert: Freitag 3. September 2010, 20:11

Hallo,
Ich wollte mit Python diese Datei öffnen:
http://www.dateiupload.com/files/96AtOAzONS.txt
leider liest python wenn ich ganz normal

Code: Alles auswählen

datei = open("datei.txt","r")
daten=datei.read()
print daten
eingebe nur diesen kleinen Teil:
;QI^)^3OG&8F.R9%\E1KE'!/C


Wieso liest Python nicht die ganze Datei?

Schonmal Danke!
deets

Du erwaehnst es nicht, aber ich vermute mal du bist mit Windows unterwegs? Dann musst du die Datei im *Binaer*-Modus oeffnen. Also "rb" statt nur "r".
campino97
User
Beiträge: 42
Registriert: Freitag 3. September 2010, 20:11

DANKE!
Es funktioniert!
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Hinzu kommt, dass Du mit print die Bytes direkt ans Terminal schickst und diese dort mitunter als Steuerzeichen interpretiert werden (von keine Ausgabe über Piepen führt das bis zu lustigem Cursorspringen und Zeilenlöschen). Verwende statt dessen repr().
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Und auch hier sollte das Plädoyer für das Öffnen von Dateien mittels `with` nicht fehlen:

Code: Alles auswählen

with open(...) as f:
    # f ist hier das file-Objekt und wird autoamtisch geschlossen;
    # f.close() ist also obsolet
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
campino97
User
Beiträge: 42
Registriert: Freitag 3. September 2010, 20:11

@jerch: Das verstehe ich nicht :K
Wieso können die bytes evtl. vom terminal als Steuersignal interpretiert werden?
und repr() gib mir doch einen string von dem objekt zurück.
Was hat das mit print zu tun?
thx.
@Hyperion: das nächste mal werde ich with benutzen

Danke für die Antworten.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

campino97 hat geschrieben: Wieso können die bytes evtl. vom terminal als Steuersignal interpretiert werden?
und repr() gib mir doch einen string von dem objekt zurück.
Was hat das mit print zu tun?
Weil ein Terminal bestimmte Byte-Werte dazu verwendet, "Dinge" zu tun, wie etwa einen Zeilenumbruch einzuschieben, einen Beep-Ton auszugeben, usw.

`repr` gibt Dir nur wirklich *druckbare* Zeichen zurück! Steuerzeichen werden ggf. mit Escape-Seuqenzen "ausgeschaltet"

Code: Alles auswählen

In [3]: print(repr("Hallo\nWelt"))
'Hallo\nWelt'

In [4]: print("Hallo\nWelt")
Hallo
Welt
campino97 hat geschrieben: @Hyperion: das nächste mal werde ich with benutzen
Was spricht dagegen, den bestehenden Code darauf umzustellen? ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
campino97
User
Beiträge: 42
Registriert: Freitag 3. September 2010, 20:11

Achso!
Jetzt versteh ich wozu man repr() braucht.

Danke
BlackJack

@campino97: Neues Thema wäre eigentlich besser. Ob man die Information für das System portabel heraus bekommen kann weiss ich nicht aus dem Kopf, aber Du kannst recht einfach ermitteln wie das mit dem laufenden Python-Interpreter aussieht:

Code: Alles auswählen

In [147]: sys.maxint
Out[147]: 2147483647
Das ist also von einem 32-Bit-Python. Das könnte aber durchaus so auch auf einem 64-Bit-System laufen.
Antworten