Probleme bei Datei auslesen bzw. Inhalt anzeigen

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.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Morgen Forum,
eine recht einfache Aufgabe eine Datei auslesen nur bekomme ich eine dicke Fehlermeldung wenn ich mir den Inhalt der Datei mit print anzeigen will.
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib64/python3.2/tkinter/__init__.py", line 1399, in __call__
return self.func(*args)
File "/home/gast/Arbeitsfläche/Projekte/Datenbank/menue.py", line 62, in bildarchiv
import Bildarchiv
File "/home/gast/Arbeitsfläche/Projekte/Datenbank/Bildarchiv.py", line 321, in <module>
app = Application(root)
File "/home/gast/Arbeitsfläche/Projekte/Datenbank/Bildarchiv.py", line 20, in __init__
self.datei_einlesen()
File "/home/gast/Arbeitsfläche/Projekte/Datenbank/Bildarchiv.py", line 33, in datei_einlesen
print(config.read())
File "/usr/lib64/python3.2/codecs.py", line 300, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfc in position 784: invalid start byte
Also das einlesen is das geringste Problem eher den Inhalt mal anzeigen zu lassen dass is das Problem und ich wüsste gern wo da das Problem liegt.

Code: Alles auswählen

def datei_einlesen(self):
      config = open("/home/gast/Arbeitsfläche/Projekte/dicomserver.txt", "r")
      print(config.read())
BlackJack

@Kalli87: Das einlesen ist nicht das geringste Problem sondern das *ist* hier das Problem. Zum `print()` kommt es gar nicht erst. Du öffnest die Datei im Textmodus ohne explizit eine Kodierung anzugeben. Python 3 versucht's dann mit der ”Systemkodierung”, in diesem Fall UTF-8, und das funktioniert mit den Daten in der Datei nicht, weil die offensichtlich nicht UTF-8 kodiert sind. Gib beim `open()` den passenden `encoding`-Parameter an, dann klappt das auch mit dem Einlesen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Und wie immer hier ein Verweis auf meine Signatur! :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

BlackJack hat geschrieben:@Kalli87: Das einlesen ist nicht das geringste Problem sondern das *ist* hier das Problem. Zum `print()` kommt es gar nicht erst. Du öffnest die Datei im Textmodus ohne explizit eine Kodierung anzugeben. Python 3 versucht's dann mit der ”Systemkodierung”, in diesem Fall UTF-8, und das funktioniert mit den Daten in der Datei nicht, weil die offensichtlich nicht UTF-8 kodiert sind. Gib beim `open()` den passenden `encoding`-Parameter an, dann klappt das auch mit dem Einlesen.
Bitte was? Warum is das jetzt so kompliziert? :shock:
Ich versteh jetzt gerade nix mehr, normal sag ich immer "open" dann die datei und "r" für lesen. BlackJack was meinst du denn bitte mit "explizite Kodierung"?
Hyperion hat geschrieben:Und wie immer hier ein Verweis auf meine Signatur! :mrgreen:
Das hilft mir erst recht nicht weiter ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Kalli87 hat geschrieben:
Hyperion hat geschrieben:Und wie immer hier ein Verweis auf meine Signatur! :mrgreen:
Das hilft mir erst recht nicht weiter ;)
Und das kannst Du sofort beurteilen? :twisted:

Mal im Ernst: Aus den verlinkten Dokumenten kannst Du lernen, was es mit dem ganzen "Encoding, Unicode und String-Krams" auf sich hat. Und das solltest Du wissen, denn ansonsten läufst Du immer wieder in diese Probleme!

In Deinem konreketen Fall kann man nicht viel mehr sagen, als dass Du folgendes tun musst:

Code: Alles auswählen

with open("{name}", "r", encoding="{encoding_name}") as f:
    # usw.
Der Parameter ``encoding`` der ``open``-Funktion wäre jetzt nicht so schwer zu finden gewesen: Link zur Doku.

Du musst halt das spezielle Encoding *wissen* und entsprechend *angeben*. Genau das hat BlackJack Dir gesagt...

(Nur ohne Verständnis, was das alles soll, bringt es natürlich wenig!)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Mich irritiert das ganze nur das ist alles! In meinen Büchern und auf den Internetseiten die ich durchstöbert habe war nie die rede von "Encoding" selbst hier im Forum war keine rede davon. (Auf den Beiträgen wo Google mich hingeführt hat) Deswegen bin ich jetzt so überrascht was ich alles angeben muss zusätzlich um nur eine Datei zu lesen.......
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: Encoding ist hier im Forum immer wieder ein Thema. Wenn einem aber das passende Stichwort fehlt, ist eine Suche schwierig, das merke ich selbst immer wieder. Aber jetzt hast Du ja das Stichwort, und die Links in Hyperions Signatur sind wirklich gut, um einen Einstieg in diese Thematik zu finden.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@Kalli87: Genau das Thema war damals ursächlich, dass ich mich hier im Forum angemeldet habe ;-) (iirc bin ich dann gleich mit Leonidas und / oder BlackJack aneinander geraten :mrgreen: )

So, mal Archäologie betrieben... Hach ja... Gott war ich damals naiv und renitent... *in Erinnrung schwelg* :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Ganz ehrlich? Ich dreh langsam am Rad wegen diesem encoding kram..... Was muss denn dort hin? utf-8 geht ja nicht..... Ich versteh es nicht
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Kalli87: Das Thema Encoding taucht möglicherweise deshalb nicht in deinen Büchern auf, weil Python 3.x intern häufig das passende Encoding verwendet. In deinem Fall passt es aber offenbar nicht. Demnach musst du dich um die Dekodierung leider selbst kümmern.

Was man grundsätzlich wissen sollte: Der Inhalt einer Datei besteht aus Bytes. Also Zeichen, die mit maximal 8 Bit dargestellt werden können. Ein Zeichen in dem von Python 3.x dargestellten String muss aber nicht zwangsläufig genau einem Byte entsprechen. Es kann auch sein, dass mehrere Bytes für ein einzelnes Zeichen verwendet werden müssen. Um jetzt zu definieren, welcher Mechanismus zum Umwandeln zwischen Bytes und "normalem" Text verwendet wurde, gibt man dies als Encoding an. Das "utf-8", welches in deiner Fehlermeldung auftaucht, ist ein Beispiel für ein solches Encoding.

Du musst nun also herausfinden, mit welchem Encoding der Text zuvor in "Byteform" gebracht und in die Datei geschrieben wurde. Ansonsten weiß Python nicht, wie es die Bytes wieder in einen für Menschen lesbaren Text bringen soll. Das heißt: Entweder du erfährst es direkt aus der Quelle (also z.B. aus dem Programmcode, der zum Schreiben verwendet wurde) - das wäre der Idealfall. Andernfalls gibt es noch Tools, welche die Kodierung erraten können und damit auch häufig richtig liegen. Du könntest dann das erratene Encoding angeben und hoffen, dass es damit funktioniert.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Ach du sch........ eibenkleister............

Danke snafu
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Also laut meinem Chef hier Praktikum wurde die Datei mit de@euro geschrieben. Bringt euch das weiter?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Kalli87 hat geschrieben:Also laut meinem Chef hier Praktikum wurde die Datei mit de@euro geschrieben.
Dann gib mal "iso-8859-15" als Encoding an. Das wird meistens für deutschsprachigen Text verwendet und kennt auch das Euro-Zeichen.

Also in der Art:

Code: Alles auswählen

import codecs

with codecs.open(dateiname, 'r', 'iso-8859-15') as infile:
    content = infile.read()
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

snafu hat geschrieben:
Kalli87 hat geschrieben:Also laut meinem Chef hier Praktikum wurde die Datei mit de@euro geschrieben.
Dann gib mal "iso-8859-15" als Encoding an. Das wird meistens für deutschsprachigen Text verwendet und kennt auch das Euro-Zeichen.

Also in der Art:
import codecs

with codecs.open(dateiname, 'r', 'iso-8859-1') as infile:
content = infile.read()
danke danke danke danke..................................... snafu, du warst meine Rettung ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@Kalli87: Ich hoffe Dir ist jetzt zumindest klar geworden, dass Du Dich mit dem Thema auseinander setzen solltest! Denn nicht immer kann man auf Rettung von außen hoffen ;-)

Und um das noch einmal klar zu stellen: Das ist *kein* Python Problem, sondern ein *allgemein gültiges*! Wer programmiert sollte ein Basiswissen darüber haben.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Wurde heute das erste mal damit konfrontiert und hatte früher nie solche Probleme.
Aber ich werde mich belesen, Danke :)
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Mal eine bescheidene Frage zur Formatierung meiner Ausgabe:

Ich hab meine Datei nun ausgelesen, das was ich brauch heraus gefiltert und mit append in eine liste gespeichert.
Wenn ich das ganze jetzt aber verwenden möchte hab ich zwischen jeden einzelnen Buchstaben oder Zahl ein Leerzeichen.
Kann man das irgendwie entfernen? Mit replace hab ich es bereits probiert aber das funktioniert leider nicht.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

``replace`` sollte aber "funktionieren"! Vermutlich verwirfst Du den Rückgabewert?

Zeig uns doch mal den Aufbau der Datei, Deine Listendaten und wie Du es versucht hast!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Wenn ich das euch zeige steinigt ihr mich virtuell ^^

Code: Alles auswählen

f = open("/home/gast/Arbeitsfläche/Projekte/dicomserver.txt", "r", encoding="iso-8859-15")
        for nummer, zeile in enumerate(f):
            export_name.append(zeile)
name = []
        for dsatz in export_name[95]:
            name.append(dsatz)
        self.test = []
        self.test.append(name[22])
        self.test.append(name[23])
        self.test.append(name[24])
        self.test.append(name[25])
Das is aber noch in der Testphase aber so konnte ich genau die Zeile verwenden die ich brauche und danach hab ich die Zeile noch zerlegt und die das raus gefiltert was ich brauche.

Ich seh schon die virtuellen Steine fliegen :wink:


ps. hier der Versuch mit dem replace

Code: Alles auswählen

self.test= self.test.replace(" ", "")
AttributeError: 'list' object has no attribute 'replace'
Ganz normal Leerzeichen gegen "nichts" ersetzen.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: hast Du Dir angeschaut, mit welchen Objekten Du hier arbeitest?
Was für einen Typ hat "name" und was steht drin?
Was für ein Typ ist "self.text" und was steht drin?
Wo hast Du Leerzeichen, und wo stören Dich die Leerzeichen?
Was macht Zeile 95 so besonders?
Antworten