urlencode() rückwärts?

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.
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
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Guck mal in der urllib, speziell da `unquote` und `unquote_plus`.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Es ist in 'urlparse'
bzw. Python3 'urllib.parse'
the more they change the more they stay the same
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?
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
the more they change the more they stay the same
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?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

In Python3 liefert map einen Generator zurück, also "fehlt" dir die Umwandlung in eine Liste.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Python 3...

Code: Alles auswählen

inhalt = f.readlines()
a = list(map(urllib.parse.unquote,inhalt))
print(a)
EDIT: zu langsam... :cry:
the more they change the more they stay the same
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
dahaze
User
Beiträge: 75
Registriert: Freitag 13. März 2009, 10:57
Wohnort: im Schwabenland

Hab leider kein Python 3.1 drauf, aber vielleicht hilft dir das weiter:

http://stackoverflow.com/questions/5403 ... buffer-api
Google ist dein Freund ! :D

Gruß,
Simon
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?
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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 :)
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?
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Sowas wie

Code: Alles auswählen

inhalt.decode(dein_encoding)
(Wenn du auf Linux bist ist dein Encoding wahrscheinlich utf-8, auf Windows afaik iso-8859-15)
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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 :lol:
the more they change the more they stay the same
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')
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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')
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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 :lol:
Meinst du nicht, dass man spätestens an dieser Stelle mal eine LC in Erwägung ziehen sollte? :)
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.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Na wie beschrieben. (ungetestet:)

Code: Alles auswählen

with open(dateiname) as datei:
  zeilen = map(dieses-unqoute-ding, datei.read().decode(encoding).split('\n'))
Antworten