Tengo una clase:
class new_import(models.TransientModel):
_name = 'new.import'
data_file = fields.Binary('File')
Mediante un asistente llamo a la clase para guardar un fichero en el campo Binary y poder parsearlo con la función:
data_file = base64.b64decode(self.data_file)
lines = data_file.split('\n')
for line in lines:
result = line[6:11]
pero algo ha fallado al guardar el fichero en el binary y decodificarlo después para leerlo,
si alguna línea contiene caracteres especiales como acentos se altera la longitud de la línea (cuando todas son de la misma longitud inicialmente),
y no leemos la misma información en la sección escogida [6:11] por ejemplo.
El fichero originalmente antes de guardarlo en el campo Binary estaba codificado en utf8.
Si mediante un script en python leo el fichero directamente no hay problema:
codecs.open(file, mode='r', encoding='utf-8')
result = line[6:11]
Está claro que es un problema de codificación cuando paso el fichero a binario (odoo lo guarda en base64) y luego hago otra vez la operación inversa.
He probado diferentes formas de encode/decode pero no doy con la solución, tal vez debería enfocar la lectura del fichero sin guardarlo en un campo Binary?
Gracias por adelantado.
encodestring'? Si las lineas "crecen" igual es porque al decodificar base64 the está escapando los bytes... prueba con str.decode('string_escape') o decirle a python que el texto recuperado está codificado en utf-8: str.encode('utf-8'). A ver si otro que sepa más del tema te puede ayudar mejor... :/class mi_modelo(models.Model):
_name = 'modulo.modelo'
data_file = fields.Binary('File')
def get_data_file_utf8_string(self):
return base64.b64decode(res.data_file).decode('utf-8') if res.data_file else None