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:)

War es hilfreich?

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

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top