parse.unquote_plus TypeError
Pergunta
Eu estou tentando formatar um arquivo para que ele possa ser inserido em um banco de dados, o arquivo é inicialmente comprimido Janeiro e adjacências 1.3MB grande. Cada linha é algo como isto:
398,% 7EAnoniem + 001% 7E, 543,480,7525010,1775,0
Esta é a forma como os olhares de código, como que analisa este arquivo:
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 eu executo o programa eu recebo este erro:
Village_Parsed = Village_Parsed + urllib.parse.unquote_plus(line);
arquivo "C: \ Python31 \ lib \ urllib \ parse.py", linha 404, em unquote_plus cadeia = string.replace ( '+', ' ') TypeError: esperado um objecto com a interface de tampão de
Qualquer idéia do que está errado aqui? Agradecemos antecipadamente por qualquer ajuda:)
Solução
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): Generic Syntax diz:
Esta especificação não impõe qualquer codificação de caracteres determinada para o mapeamento entre os caracteres e URI os octetos usado para armazenar ou transmitir esses caracteres. Quando um URI aparece num elemento de protocolo, a codificação de caracteres é definido por essa protocolo; sem tal definição, uma URI é assumida para estar em a mesma codificação de caracteres como a circundante texto.
Portanto 'ascii'
no fragmento line.decode('ascii')
deve ser substituído por qualquer codificação de caracteres que você usou para codificar seu texto.
Outras dicas
PROBLEMA 1 é que urllib.unquote_plus não gosta da line
que você tem alimentado ele. A mensagem deve ser "Por favor, forneça um objeto str" :-) Eu sugiro que você corrigir o problema 2 abaixo, e insira:
print('line', type(line), repr(line))
imediatamente após a sua declaração for
para que você possa ver o que você está recebendo em line
.
Você vai descobrir que ele retorna bytes objetos:
>>> [line for line in gzip.open('test.gz')]
[b'nudge nudge\n', b'wink wink\n']
Usando um modo de 'r' tem efeito escasso:
>>> [line for line in gzip.open('test.gz', 'r')]
[b'nudge nudge\n', b'wink wink\n']
Eu sugiro que em vez de passar line
à rotina de análise de passar line.decode('UTF-8')
... ou qualquer codificação foi usada quando o arquivo GZ foi escrito.
PROBLEMA 2 é nesta linha:
Village_Parsed = str
str
é um tipo. Você precisa de um objeto str vazio. Para conseguir isso, você poderia chamar o tipo ou seja str()
que é formalmente correta, mas pouco prático / incomum / scoffable / estranho quando comparado ao uso de um ''
string constante ... então faça o seguinte:
Village_Parsed = ''
Você também tem PROBLEMA 3:. A sua última declaração está tentando ler o arquivo gz após EOF