parse.unquote_plus Typeerror
Frage
Ich versuche, eine Datei zu formatieren, so dass sie in eine Datenbank eingefügt werden können, wird die Datei ursprünglich komprimiert und arround 1,3MB groß. Jede Zeile sieht etwa so aus:
398,% 7EAnoniem + 001% 7E, 543,480,7525010,1775,0
Dies ist, wie der Code so aussieht parst diese Datei:
Village = gzip.open(Root+'\\data'+'\\' +str(Newest_Date[0])+'\\' +str(Newest_Date[1])+'\\' +str(Newest_Date[2])\
+'\\'+str(Newest_Date[3])+' village.gz');
Village_Parsed = str
for line in Village:
Village_Parsed = Village_Parsed + urllib.parse.unquote_plus(line);
print(Village.readline());
Wenn ich das Programm laufen bekomme ich diesen Fehler:
Village_Parsed = Village_Parsed + urllib.parse.unquote_plus(line);
Datei "C: \ Python31 \ lib \ urllib \ parse.py", Linie 404, in unquote_plus string = string.replace ( '+', ' ‚) Typeerror: erwartete ein Objekt mit der Puffer-Schnittstelle
Jede Idee, was ist hier los? Vielen Dank im Voraus für jede Hilfe:)
Lösung
import gzip, os, urllib.parse
archive_relpath = os.sep.join(map(str, Newest_Date[:4])) + ' village.gz'
archive_path = os.path.join(Root, 'data', archive_relpath)
with gzip.open(archive_path) as Village:
Village_Parsed = ''.join(urllib.parse.unquote_plus(line.decode('ascii'))
for line in Village)
print(Village_Parsed)
Ausgabe:
398,~Anoniem 001~,543,480,7525010,1775,0
Hinweis: RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax sagt:
Diese Spezifikation schreibt nicht vor eine bestimmte Zeichencodierung für die Zuordnung zwischen den Zeichen und URI die Oktette verwendet zu speichern oder diese Zeichen übertragen. Wenn ein URI Erscheint in einem Protokollelement der Zeichenkodierung wird durch die definierte Protokoll; ohne eine solche Definition wird ein URI angenommen in seine die gleiche wie die Zeichencodierung umgebender Text.
Daher 'ascii'
im line.decode('ascii')
Fragmente durch ersetzt werden soll, was auch immer die Zeichenkodierung Sie verwendet haben, Ihren Text zu kodieren.
Andere Tipps
PROBLEM 1 ist, dass urllib.unquote_plus nicht die line
mag, dass Sie es gefüttert haben. Die Nachricht sollte „Bitte geben Sie eine str Objekt“ sein :-) Ich schlage vor, dass Sie 2 unten beheben Problem und einfügen:
print('line', type(line), repr(line))
unmittelbar nach Ihrer for
Anweisung, so dass Sie sehen, was Sie in line
bekommen.
Sie werden feststellen, dass es zurückgibt Bytes Objekte:
>>> [line for line in gzip.open('test.gz')]
[b'nudge nudge\n', b'wink wink\n']
einen Modus von 'r' Verwendung hat wenig Wirkung:
>>> [line for line in gzip.open('test.gz', 'r')]
[b'nudge nudge\n', b'wink wink\n']
Ich schlage vor, dass anstelle line
auf die Analyseroutine von geben Sie line.decode('UTF-8')
passieren ... oder was auch immer Codierung verwendet wurde, als die gz-Datei geschrieben wurde.
PROBLEM 2 ist in dieser Zeile:
Village_Parsed = str
str
ist ein Typ. Sie benötigen ein leeres str Objekt. Um das, könnte man die Art nennt das heißt str()
die formal korrekt ist, aber unpraktisch / ungewöhnlich / scoffable / komisch, wenn im Vergleich zu einem String-Konstante ''
mit ... so tun:
Village_Parsed = ''
Sie haben auch PROBLEM 3: Ihre letzte Anweisung versucht, die gz-Datei nach der EOF zu lesen
.