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
urlencode() rückwärts?
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
Guck mal in der urllib, speziell da `unquote` und `unquote_plus`.
Es ist in 'urlparse'
bzw. Python3 'urllib.parse'
bzw. Python3 'urllib.parse'
the more they change the more they stay the same
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?
Code: Alles auswählen
es_kommt_eine_liste_zurück = map(unquote_plus, meine_liste_mit_den_strings)
the more they change the more they stay the same
Ich bin anscheinend echt zu blöd:
Als Ausgabe bekomme ich:
<map object at 0x02060930>
Was mach ich falsch?
Code: Alles auswählen
[...]
inhalt = f.readlines()
a = map(urllib.parse.unquote,inhalt)
print(a)
<map object at 0x02060930>
Was mach ich falsch?
Python 3...
EDIT: zu langsam...
Code: Alles auswählen
inhalt = f.readlines()
a = list(map(urllib.parse.unquote,inhalt))
print(a)
the more they change the more they stay the same
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
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
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
http://stackoverflow.com/questions/5403 ... buffer-api
Google ist dein Freund !
Gruß,
Simon
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?
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?
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
Die urllib will unicode, keine Bytestrings. Also unicode hinschicken, ja :)So the error is rather opaquely telling you ‘you can't pass a byte string to urllib.parse’.
Ich steh grad auf dem Schlauch, wie ich das machen soll!
Was muss ich da bei Zeile 2 hinzufügen?
Code: Alles auswählen
inhalt = f.readlines()
a = list(map(urllib.parse.unquote,inhalt))
print(a)
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
Sowas wie
(Wenn du auf Linux bist ist dein Encoding wahrscheinlich utf-8, auf Windows afaik iso-8859-15)
Code: Alles auswählen
inhalt.decode(dein_encoding)
So sollte es gehen, ich bin mir aber wirklich nicht sicher!
//Edit zu langsam, um 5min
Code: Alles auswählen
>>> list(map(lambda x: up(x.decode('utf-8')), [b'%7C', b'%20', b'test+test']))
['|', ' ', 'test test']
the more they change the more they stay the same
Danke euch beiden, das funktioniert leider nicht, als Fehlermeldung erhalte ich, dass man Listen nicht kodieren kann. (AttributeError: 'list' object has no attribute 'decode')
-
- 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')
Meinst du nicht, dass man spätestens an dieser Stelle mal eine LC in Erwägung ziehen sollte?Dav1d hat geschrieben:So sollte es gehen, ich bin mir aber wirklich nicht sicher!
//Edit zu langsam, um 5minCode: Alles auswählen
>>> list(map(lambda x: up(x.decode('utf-8')), [b'%7C', b'%20', b'test+test'])) ['|', ' ', 'test test']
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.
-
- 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'))