Seite 1 von 1

Problem mit startswith (bytes vs. str)

Verfasst: Dienstag 17. September 2013, 08:04
von mdatab
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.

Re: Problem mit startswith (bytes vs. str)

Verfasst: Dienstag 17. September 2013, 08:19
von 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:

Re: Problem mit startswith (bytes vs. str)

Verfasst: Dienstag 17. September 2013, 08:30
von mdatab
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. :)

Re: Problem mit startswith (bytes vs. str)

Verfasst: Dienstag 17. September 2013, 08:34
von snafu
@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

Re: Problem mit startswith (bytes vs. str)

Verfasst: Dienstag 17. September 2013, 08:35
von mdatab
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:

Re: Problem mit startswith (bytes vs. str)

Verfasst: Dienstag 17. September 2013, 08:37
von mdatab
snafu hat geschrieben:Denn bei mir klappt es problemlos
@snafu: Ja, du hast völlig recht.

Re: Problem mit startswith (bytes vs. str)

Verfasst: Dienstag 17. September 2013, 08:42
von snafu
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.

Re: Problem mit startswith (bytes vs. str)

Verfasst: Dienstag 17. September 2013, 08:49
von sparrow
Und das passiert wahrscheinlich spätestens bei "Die Ärzte" ;)

Re: Problem mit startswith (bytes vs. str)

Verfasst: Dienstag 17. September 2013, 08:53
von 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”. :-)

Re: Problem mit startswith (bytes vs. str)

Verfasst: Donnerstag 19. September 2013, 07:58
von sparrow
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" ;)