parse.unquote_plus TypeError
Domanda
Sto cercando di formattare un file in modo che possa essere inserito in un database, il file viene inizialmente compresso e arround grande 1.3MB. Ogni linea simile a questa:
398,% 7EAnoniem + 001% 7E, 543,480,7525010,1775,0
In questo modo il codice sembra che analizza questo file:
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());
Quando eseguo il programma ottengo questo errore:
Village_Parsed = Village_Parsed + urllib.parse.unquote_plus(line);
file "C: \ Python31 \ lib \ urllib \ parse.py", la linea 404, in unquote_plus stringa = String.Replace ( '+', ' ') TypeError: atteso un oggetto con l'interfaccia tampone
Qualche idea su ciò che è sbagliato? Grazie in anticipo per qualsiasi aiuto:)
Soluzione
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)
Output:
398,~Anoniem 001~,543,480,7525010,1775,0
NOTA: RFC 3986 - Uniform Resource Identifier (URI): Sintassi Generico dice:
Questa specificazione non mandato qualsiasi codifica particolare carattere per la mappatura tra i caratteri e URI gli ottetti utilizzati per memorizzare o trasmettere quei personaggi. Quando un URI appare in un elemento di protocollo, la codifica dei caratteri è definito da tale protocollo; senza tale definizione, un URI si presume essere in la stessa codifica dei caratteri come testo circostante.
Pertanto 'ascii'
nel frammento line.decode('ascii')
dovrebbe essere sostituito con qualsiasi codifica dei caratteri che hai utilizzato per codificare il testo.
Altri suggerimenti
PROBLEMA 1 è che urllib.unquote_plus non piace il line
che avete nutrito. Il messaggio deve essere "Si prega di fornire un oggetto str" :-) Vi suggerisco di risolvere il problema 2 qui sotto, ed inserto:
print('line', type(line), repr(line))
immediatamente dopo la sua dichiarazione for
in modo che si può vedere che cosa hai trovato in line
.
Troverete che restituisce i byte oggetti:
>>> [line for line in gzip.open('test.gz')]
[b'nudge nudge\n', b'wink wink\n']
Utilizzando una modalità di 'r' ha un effetto scarso:
>>> [line for line in gzip.open('test.gz', 'r')]
[b'nudge nudge\n', b'wink wink\n']
Io suggerisco che invece di passare line
alla routine di analisi si passa line.decode('UTF-8')
... o qualsiasi altra cosa la codifica è stato utilizzato quando il file gz è stato scritto.
PROBLEMA 2 è in questa linea:
Village_Parsed = str
str
è un tipo. Avete bisogno di un oggetto str vuota. Per ottenere questo, si potrebbe chiamare il tipo cioè str()
che è formalmente corretto ma poco pratico / inusuali / scoffable / strano quando rispetto all'utilizzo di una costante stringa ''
... quindi fare questo:
Village_Parsed = ''
Hai anche PROBLEMA 3: la tua ultima affermazione sta cercando di leggere il file gz dopo EOF
.