Estoy usando Solr 3.3 para indexar cosas de mi base de datos. Compongo el contenido JSON en Python. Logro subir 2126 registros que sumn 523246 caracteres (aproximadamente 511kb) . Pero cuando bash 2027 registros, Python me da el error:
Traceback (most recent call last): File "", line 1, in File "D:\Technovia\db_indexer\solr_update.py", line 69, in upload_service_details request_string.append(param_list) File "C:\Python27\lib\json\__init__.py", line 238, in dumps **kw).encode(obj) File "C:\Python27\lib\json\encoder.py", line 203, in encode chunks = list(chunks) File "C:\Python27\lib\json\encoder.py", line 425, in _iterencode for chunk in _iterencode_list(o, _current_indent_level): File "C:\Python27\lib\json\encoder.py", line 326, in _iterencode_list for chunk in chunks: File "C:\Python27\lib\json\encoder.py", line 384, in _iterencode_dict yield _encoder(value) UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 68: invalid start byte
Ay. ¿Es 512kb de bytes un límite fundamental? ¿Hay alguna alternativa de alto volumen al módulo JSON existente?
Actualización : es un error de algunos datos, ya que intentar codificar * biz_list [2126:] * provoca un error inmediato. Aquí está la pieza ofensiva:
‘2nd Floor, Gurumadhavendra Towers, \ nKadavanthra Road, Kaloor, \ nCochin \ x96 682 017′
¿Cómo puedo configurarlo para que pueda codificarse en JSON?
Actualización 2 : La respuesta funcionó como se esperaba: los datos provienen de una tabla MySQL codificada en “latin-1-swedish-ci”. Vi importancia en un número aleatorio. Perdón por canalizar espontáneamente el espíritu de un escritor de titulares al diagnosticar la falla.
Simple, simplemente no use la encoding utf-8 si sus datos no están en utf-8
>>> json.loads('["\x96"]') .... UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 0: invalid start byte >>> json.loads('["\x96"]', encoding="latin-1") [u'\x96']
json.loads
Si
s
es una instancia destr
y está codificada con una encoding basada en ASCII distinta de utf-8 (por ejemplo, latin-1), se debe especificar un nombre deencoding
apropiado. Las codificaciones que no están basadas en ASCII (como UCS-2) no están permitidas y deben decodificarse primero aunicode
.
Edición : Para obtener el valor Unicode adecuado de “\ x96”, use “cp1252” como mencionó Eli Collins
>>> json.loads('["\x96"]', encoding="cp1252") [u'\u2013']