Problem mit startswith (bytes vs. str)

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
mdatab
User
Beiträge: 8
Registriert: Dienstag 8. Juni 2004, 18:31

Hallo,

sorry, falls das eher in die Rubrik Netzwerkprogrammierung gehört - ich war mir nicht sicher.
Jedenfalls, ich möchte gerne eine entfernte (Text-)Datei Zeile für Zeile durchsuchen. Ich habe folgendes:

Code: Alles auswählen

with urllib.request.urlopen(myurl) as remotefile:
    for line in remotefile:
        if not line.startswith('#'):
            print('todo')
Nun erhalte ich aber folgende Fehlermeldung:

Code: Alles auswählen

TypeError: startswith first arg must be bytes or a tuple of bytes, not str
Sicherlich mache ich etwas falsch... Aber was? Bei der Datei handelt es sich um eine M3U-Playlist.

Vielen Dank.
BlackJack

@mdatab: Über die Verbindung kommen Bytes, und Du versuchst mit deren `startswith()`-Methode zu prüfen ob die Bytekette mit einer Zeichenkette (`str`) anfängt. Das geht nicht. Du musst entweder die Daten aus der Netzverbindung in Zeichenketten umwandeln, oder testen ob das Byte mit dem ASCII-Wert vom ASCII-Zeichen ``#`` am Anfang steht. Letzteres ist einfacher, da musst Du aus dem ``'#'`` nur ein ``b'#'`` machen. Wenn Du mit den Zeilen aber als Text weiterarbeiten möchtest, solltest Du dekodieren. Das `io`-Modul stellt da zum Beispiel Wrapperklassen zur Verfügung. Da stellt sich dann die Frage in welcher Kodierung M3U-Dateien eigentlich gespeichert sind. Willkommen in der lustigen Welt von Unicode. :twisted:
mdatab
User
Beiträge: 8
Registriert: Dienstag 8. Juni 2004, 18:31

BlackJack hat geschrieben:Letzteres ist einfacher, da musst Du aus dem ``'#'`` nur ein ``b'#'`` machen.
Das dachte ich mir auch schon, aber wenn ich das mache bekomme ich diese Fehlermeldung:

Code: Alles auswählen

TypeError: Can't convert 'bytes' object to str implicitly
EDIT: Ops, sorry, vergiss den Beitrag. :)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@mdatab: Zeig mal bitte den kompletten Traceback (insbesondere wegen der Zeilenangabe) und den Code, bei dem der Fehler *tatsächlich* auftritt (bitte keine nachträglichen Anpassungen machen). Denn bei mir klappt es problemlos:

Code: Alles auswählen

Python 3.2.3 (default, Apr 10 2013, 05:07:54) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> foo = b'#foo'
>>> foo.startswith(b'#')
True
mdatab
User
Beiträge: 8
Registriert: Dienstag 8. Juni 2004, 18:31

Danke für den Tipp. Das hat funktioniert. Ich hatte das schonmal ausprobiert und dachte das geht nicht, aber ich hatte übersehen, dass es dann an anderer Stelle gekracht hatte.

Jedenfalls, so geht es … vermutlich, bis eine M3U Datei mal in UTF-8 codiert ist. :roll:
mdatab
User
Beiträge: 8
Registriert: Dienstag 8. Juni 2004, 18:31

snafu hat geschrieben:Denn bei mir klappt es problemlos
@snafu: Ja, du hast völlig recht.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

mdatab hat geschrieben:Jedenfalls, so geht es … vermutlich, bis eine M3U Datei mal in UTF-8 codiert ist. :roll:
Problematisch wird es eigentlich erst, wenn Zeichen außerhalb von ASCII benutzt werden. Wobei eine UTF-8 Kodierung natürlich nahelegt, dass so etwas durchaus passieren kann.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Und das passiert wahrscheinlich spätestens bei "Die Ärzte" ;)
BlackJack

@snafu: Die ”Gefahr” das M3U-Playlisten etwas ausserhalb von ASCII enthalten ist relativ hoch. Selbst englischsprachige Benutzer sind davor nicht sicher, und als Europäer muss man ziemlich sicher damit rechnen IMHO. Vom asiatischen Sprachraum mal ganz zu schweigen. :-)

@sparrow: Bei mir passierts früher — nämlich schon bei den „Abstürzende Brieftauben”. :-)
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

BlackJack hat geschrieben:@sparrow: Bei mir passierts früher — nämlich schon bei den „Abstürzende Brieftauben”. :-)
ok, das it OT:

"Ich wär' so gerne Bademeister, hier am Nordseestrand... da hätt' ich allerhand zu tun, mit dem Fernglas in der Hand" ;)
Antworten