noch ein encoding-Problem?

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
buthor
User
Beiträge: 5
Registriert: Freitag 11. Mai 2012, 17:11

Hallo,

ich habe folgendes Problem:
mit meinem python-script lade ich eine xml-Datei aus dem Internet. Die XML-Datei ist UTF-8 codiert. Die XML-Datei parse ich mit libxml2.parseDoc und hole mir daraus mit
xpath (xpathEval) u.a. einen Namen und eine URL.
Nun erstelle ich anhand des Namens einen kompletten Pfad, hol mir die Datei und speichere sie im Dateisystem unter dem erstellten Pfad.

Das funktioniert auch zu 98% immer, außer wenn im Dateinamen Umlaute, bzw Sonderzeichen enthalten sind.

z.B. der zusammengesetzte Pfad lautet:
/platte/Aufnahmen/Serien/Magnum/Magnum (Saras Rückkehr / Kalter Krieg unter heißer Sonne).mp4
Das wird auch so in der Console korrekt mit Umlauten etc angezeigt

Wenn ich dann an die Stelle Download komme, kommt der Fehler:

Traceback (most recent call last):
File "xxx.py", line 564, in <module>
aufnahme.downloadMovie()
File "xxx.py", line 286, in downloadMovie
urllib.urlretrieve( url, fullpath )
File "/usr/lib/python2.6/urllib.py", line 93, in urlretrieve
return _urlopener.retrieve(url, filename, reporthook, data)
File "/usr/lib/python2.6/urllib.py", line 243, in retrieve
tfp = open(filename, 'wb')
IOError: [Errno 2] No such file or directory: '/platte/Aufnahmen/Serien/Magnum/Magnum (Saras R\xc3\xbcckkehr / Kalter Krieg unter hei\xc3\x9fer Sonne).mp4'

Und ich weiß nicht, was ich tun soll. Hab schon glaube ich alles ausprobiert mit encode und decode.
Ich weiß nicht weiter.

Kann mir da jemand helfen?
Komischerweise habe ich bereits mit diesem Code Dateien heruntergeladen, die Umlaute im Dateinamen haben.
Zuletzt geändert von buthor am Freitag 11. Mai 2012, 17:54, insgesamt 1-mal geändert.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Hast Du mal versucht, die url-encodiert abzuschicken? Dann werden die Umlaute nicht mehr als UTF-8 rausgeschickt.
buthor
User
Beiträge: 5
Registriert: Freitag 11. Mai 2012, 17:11

ich hole mir ja am Anfang das rss-file mit

rss = libxml2.parseDoc( urllib.urlopen( URL ) )

meinst Du diese URL?
also
rss = libxml2.parseDoc( urllib.urlopen( urllib.urlencode( URL ) ) )
BlackJack

@buthor: Speziell in diesem Fall dürfte das weniger mit Umlauten zu tun haben, sondern dass da ein Schrägstrich im Dateinamen ist. Der Pfad beschreibt ja die Datei ' Kalter Krieg unter heißer Sonne).mp4' im Verzeichnis '/platte/Aufnahmen/Serien/Magnum/Magnum (Saras Rückkehr /'
buthor
User
Beiträge: 5
Registriert: Freitag 11. Mai 2012, 17:11

oh, das ist mir noch gar nicht aufgefallen.

bedeutet, im Dateinamen den Slash entfernen oder escapen. richtig?
BlackJack

@buthor: Und eventuell noch andere Zeichen, die ein Dateisystem eventuell nicht mag.
buthor
User
Beiträge: 5
Registriert: Freitag 11. Mai 2012, 17:11

Hallo BlackJack

vielen Dank für das gute Auge :D und die schnelle Antwort.

ein kleines replace("/","-") wirkt Wunder.

funktioniert!!!


DANKE
lunar

@buthor: Gibt es einen besondere Grund dafür, dass Du libxml verwendest? Im Allgemeinen gibt es bessere, weil komfortablere Python-APIs zur XML-Verarbeitung, beispielsweise ElementTree in der Standardbibliothek, oder lxml.
buthor
User
Beiträge: 5
Registriert: Freitag 11. Mai 2012, 17:11

Nein einen besonderen Grund gibt es nicht.

Bin noch relativ neu im python programmieren.
Und wie das so ist als Einsteiger: probieren-googlen-lesen-fragen.
Und wenn man dann was besseres findet: ändern.

Danke für den Tipp. Ich werds mal ausprobieren.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

buthor hat geschrieben: Bin noch relativ neu im python programmieren.
Und wie das so ist als Einsteiger: probieren-googlen-lesen-fragen.
Ich denke genau diese Erfahrung macht deutlich, wie gut Leonidas' Idee vom "Unfuck the Wiki"-Sprint ist. Denn unsere Modul-Liste ist teilweise veraltet und imho auch zu "kurz". Wie oft schlagen wie hier Unwissenden Module (und APIs) vor (etree -> lxml, http -> requests, ...)? Natürlich ist die Sichtbarkeit des Wikis nicht hoch, aber wenn man dort auf etwas aktuelles verweisen könnte, wäre das imho schon ein Fortschritt.

... und sobald Inyoka kommt, erhöht sich ja auch die Sichtbarkeit... SCNR :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten