parse.unquote_plus TypeError
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:)
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
.