Pregunta

Estoy tratando de dar formato a un archivo de forma que se puede insertar en una base de datos, el archivo se comprime inicialmente et alrededores grande de 1,3 MB. Cada línea es como la siguiente:

  

398,% 7EAnoniem + 001% 7E, 543,480,7525010,1775,0

Esta es la forma en que el código es el que analiza este archivo:

   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());

Al ejecutar el programa me sale este error:

Village_Parsed = Village_Parsed + urllib.parse.unquote_plus(line);
     

archivo "C: \ Python31 \ lib \ urllib \ parse.py", línea 404, en unquote_plus      cadena = String.Replace ( '+', ' ')   TypeError: se espera un objeto con la interfaz de tampón

¿Alguna idea de lo que está mal aquí? Gracias de antemano por cualquier ayuda:)

¿Fue útil?

Solución

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)

Salida:

398,~Anoniem 001~,543,480,7525010,1775,0

NOTA: RFC 3986 - Uniform Resource Identifier (URI): Sintaxis Genérica dice:

  

Esta especificación no impone   cualquier codificación de carácter particular   para el mapeo entre caracteres URI y   los octetos utilizados para almacenar o   transmitir esos caracteres. Cuando un URI   aparece en un elemento de protocolo, la   codificación de caracteres se define por que   protocolo; sin tal una   definición, un URI se supone que es en   la misma codificación de caracteres como el   texto circundante.

Por lo tanto 'ascii' en el fragmento line.decode('ascii') debe ser reemplazado por cualquier codificación de caracteres que ha utilizado para codificar el texto.

Otros consejos

1 PROBLEMA es que urllib.unquote_plus no le gusta la line que ha alimentado. El mensaje debe ser "Por favor suministrar un objeto str" :-) Le sugiero que solucionar el problema 2 a continuación, y añade lo siguiente:

print('line', type(line), repr(line))

inmediatamente después de su declaración for de manera que se puede ver lo que está recibiendo en line.

Usted encontrará que devuelve los bytes objetos:

>>> [line for line in gzip.open('test.gz')]
[b'nudge nudge\n', b'wink wink\n']

Uso de un modo de 'r' tiene escaso efecto:

>>> [line for line in gzip.open('test.gz', 'r')]
[b'nudge nudge\n', b'wink wink\n']

Le sugiero que en lugar de pasar line a la rutina de análisis se pasa line.decode('UTF-8') ... o lo que sea la codificación se utilizó cuando el archivo gz fue escrito.

PROBLEMA 2 está en esta línea:

Village_Parsed = str

str es un tipo. Es necesario un objeto str vacía. Para conseguir eso, se podría llamar el tipo str() es decir, que es formalmente correcta pero poco práctico / inusual / scoffable / raro en comparación con el uso de un '' constante de cadena ... así que hacer esto:

Village_Parsed = ''

También tiene PROBLEMA 3: su último estado está tratando de leer el archivo gz después de EOF

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top