[V8] Error al leer un fichero mediante un campo Binary

528 views
Skip to first unread message

David Diz

unread,
Jun 22, 2016, 8:13:02 AM6/22/16
to Usuarios Odoo / OpenERP en España

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.

David Diz

unread,
Jun 26, 2016, 12:06:44 PM6/26/16
to Usuarios Odoo / OpenERP en España
No encuentro solución a este tema, al guardar un archivo txt (utf8) en un campo binary se guarda en formato base64 y al convertirlo a string de nuevo se pierde información.
En mi caso inicialmente en el txt todas las líneas eran de 412 caracteres, al convertirlo en base64 y después otra vez a texto con base64.b64decode las líneas tienen 412,413,414 o 415 dependiendo del número de caracteres especiales que tuviera la línea.
El problema es al guardarlo en el campo binary, por que después haga lo que haga al volver a convertirlo a texto ya no es el mismo texto.

Intentaré pasear el archivo sin guardarlo en el campo binary, ¿cómo puedo hacer que el usuario seleccioné el archivo en un formulario sin utilizar un binary field? ¿quizás utilizando ir.attachment?

unsigned char*

unread,
Jun 26, 2016, 3:31:28 PM6/26/16
to Usuarios Odoo / OpenERP en España
¿usas '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... :/


El miércoles, 22 de junio de 2016, 14:13:02 (UTC+2), David Diz escribió:

David Diz

unread,
Jun 26, 2016, 6:46:32 PM6/26/16
to Usuarios Odoo / OpenERP en España
Para decodificar de base64 utilizo base64.b64decode y luego he probado de todo, incluidas tús sugerencias pero no ha funcionado, pero gracias
Message has been deleted

unsigned char*

unread,
Jun 26, 2016, 9:48:58 PM6/26/16
to Usuarios Odoo / OpenERP en España
Quizás con el módulo de "knowledge" tengas lo que andas buscando... habilita el guardar archivos en cualquier registro de cualquier modelo.
En cualquier caso acabo de probar y recupero el documento sin problema desde el formulario (usando el botón 'Guardar Como') o desde código con 'b64decode'...
Message has been deleted

unsigned char*

unread,
Jun 26, 2016, 10:16:51 PM6/26/16
to Usuarios Odoo / OpenERP en España
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

David Diz

unread,
Jun 27, 2016, 4:20:49 AM6/27/16
to Usuarios Odoo / OpenERP en España
Este código que propones es exactamente el que pongo en mi pregunta y no funciona. Voy a intentarlo con el módulo knowledge y con la clase ir.attachment.
Reply all
Reply to author
Forward
0 new messages