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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top