Seite 1 von 2
urlencode() rückwärts?
Verfasst: Montag 15. Februar 2010, 18:05
von heiliga horsd
Hallo Forum,
ich habe ein kleines Problem: Ich habe Datensätze in einer Textdatei, ein Datensatz steht jeweils in einer Zeile, die einzelnen Daten sind per Komma durcheinander getrennt. Anschließend ist das ganze noch mit urlencode() (der PHP-Funktion) konvertiert worden.
Ich habe nun die Datei eingelesen und zeilenweise in einer Liste abgespeichert, komme nur leider nicht drauf, wie ich sie so verändern kann, dass das urlencode rückgängig gemacht wird.
Kann mir jemand helfen?
Lg HH
Verfasst: Montag 15. Februar 2010, 18:32
von Dauerbaustelle
Guck mal in der urllib, speziell da `unquote` und `unquote_plus`.
Verfasst: Montag 15. Februar 2010, 18:34
von Dav1d
Es ist in 'urlparse'
bzw. Python3 'urllib.parse'
Verfasst: Montag 15. Februar 2010, 18:43
von heiliga horsd
Danke euch beiden. Leider nimmt die Funktionen nur Strings entgegen - muss ich nun also durch die liste durchiterieren, alles einzeln zu einem string konvertieren, durch die funktion rascheln lassen und dann wieder zurück in die liste oder gehtdas auch einfacher?
Verfasst: Montag 15. Februar 2010, 18:45
von Dav1d
Code: Alles auswählen
es_kommt_eine_liste_zurück = map(unquote_plus, meine_liste_mit_den_strings)
EDIT: omg, unquote_plus ist in der urllib und unquote in urlparse
Verfasst: Montag 15. Februar 2010, 18:56
von heiliga horsd
Ich bin anscheinend echt zu blöd:
Code: Alles auswählen
[...]
inhalt = f.readlines()
a = map(urllib.parse.unquote,inhalt)
print(a)
Als Ausgabe bekomme ich:
<map object at 0x02060930>
Was mach ich falsch?
Verfasst: Montag 15. Februar 2010, 18:58
von derdon
In Python3 liefert map einen Generator zurück, also "fehlt" dir die Umwandlung in eine Liste.
Verfasst: Montag 15. Februar 2010, 18:59
von Dav1d
Python 3...
Code: Alles auswählen
inhalt = f.readlines()
a = list(map(urllib.parse.unquote,inhalt))
print(a)
EDIT: zu langsam...

Verfasst: Montag 15. Februar 2010, 19:21
von heiliga horsd
Danke, aber es funktioniert immer noch nicht, wobei ich mir die Fehlermeldung nicht erklären kann:
a = list(map(urllib.parse.unquote,inhalt))
File "C:\Python31\lib\urllib\parse.py", line 306, in unquote
res = string.split('%')
TypeError: Type str doesn't support the buffer API
Verfasst: Dienstag 16. Februar 2010, 07:43
von dahaze
Hab leider kein Python 3.1 drauf, aber vielleicht hilft dir das weiter:
http://stackoverflow.com/questions/5403 ... buffer-api
Google ist dein Freund !
Gruß,
Simon
Verfasst: Dienstag 16. Februar 2010, 11:10
von heiliga horsd
Hallo,
das hilft mir (bedingt) weiter - ich weiß nämlich immer noch nicht, wie ich das beheben soll. Muss ich also erst alle Strings zu Unicode konvertieren oder verstehe ich das falsch?
Verfasst: Dienstag 16. Februar 2010, 12:37
von Dauerbaustelle
So the error is rather opaquely telling you ‘you can't pass a byte string to urllib.parse’.
Die urllib will unicode, keine Bytestrings. Also unicode hinschicken, ja :)
Verfasst: Dienstag 16. Februar 2010, 13:01
von heiliga horsd
Ich steh grad auf dem Schlauch, wie ich das machen soll!
Code: Alles auswählen
inhalt = f.readlines()
a = list(map(urllib.parse.unquote,inhalt))
print(a)
Was muss ich da bei Zeile 2 hinzufügen?
Verfasst: Dienstag 16. Februar 2010, 13:05
von Dauerbaustelle
Sowas wie
(Wenn du auf Linux bist ist dein Encoding wahrscheinlich utf-8, auf Windows afaik iso-8859-15)
Verfasst: Dienstag 16. Februar 2010, 13:10
von Dav1d
So sollte es gehen, ich bin mir aber wirklich nicht sicher!
Code: Alles auswählen
>>> list(map(lambda x: up(x.decode('utf-8')), [b'%7C', b'%20', b'test+test']))
['|', ' ', 'test test']
//Edit zu langsam, um 5min

Verfasst: Dienstag 16. Februar 2010, 13:32
von heiliga horsd
Danke euch beiden, das funktioniert leider nicht, als Fehlermeldung erhalte ich, dass man Listen nicht kodieren kann. (AttributeError: 'list' object has no attribute 'decode')
Verfasst: Dienstag 16. Februar 2010, 13:46
von Dauerbaustelle
Oh Mist, stimmt. Dekodiere den Inhalt schon beim Auslesen. Sowas hier:
Code: Alles auswählen
with open(dateiname) as datei:
inhalt = datei.read().decode(encoding).split('\n')
Verfasst: Dienstag 16. Februar 2010, 14:01
von snafu
Dav1d hat geschrieben:So sollte es gehen, ich bin mir aber wirklich nicht sicher!
Code: Alles auswählen
>>> list(map(lambda x: up(x.decode('utf-8')), [b'%7C', b'%20', b'test+test']))
['|', ' ', 'test test']
//Edit zu langsam, um 5min

Meinst du nicht, dass man spätestens an dieser Stelle mal eine LC in Erwägung ziehen sollte?

Verfasst: Dienstag 16. Februar 2010, 14:37
von heiliga horsd
OK, das funktioniert, nur leider hab ich das Problem, dass nun jedes Element der Liste bloß ein Zeichen enthält - wie kann ich das nun so machen, dass (wie ursprünglich eigentlich auch) ein Element den ganzen Datensatz (bestehend aus 6 Feldern, mit Komma getrennt) enthält.
Verfasst: Dienstag 16. Februar 2010, 14:47
von Dauerbaustelle
Na wie beschrieben. (ungetestet:)
Code: Alles auswählen
with open(dateiname) as datei:
zeilen = map(dieses-unqoute-ding, datei.read().decode(encoding).split('\n'))