leer csv subido

57 views
Skip to first unread message

Gonzalo V

unread,
Oct 14, 2016, 10:39:56 PM10/14/16
to djan...@googlegroups.com
Estimados amigos:
tengo hecho un formulario para subir un archivo pero no puedo leerlo. ¿Se puede leer desde la memoria o hay que guardarlo?, ahora, para leerlo, hay que llamarlo desde el directorio donde fue guardado o se puede leer directamente desde la memoria. Llevo varios dias trancado tratando de ver como se lee el archivo para poblar mi base de datos
mi codigo es:
def subir(Request):
    form=ActualizarForm()
    if Request.method=="POST":
        form=ActualizarForm(Request.POST,Request.FILES)
        if form.is_valid(): #ve si el formulario es valido
            print('pase por formulario valido')
            newdoc=ActualizaModel(csvact=Request.FILES['archivoformulario']) #crea el objeto con el archivo dentro lo que va entre corchetes es el campo del formulario
            newdoc.save()
            archivo=Request.FILES['archivoformulario']
            #f=open(archivo,encoding="utf-8-sig")
            #sr=csv.DictReader(archivo,delimiter=';', dialect='excel') 
            with open(archivo) as sr:
                reader=csv.DictReader(sr,delimiter=';')
                for row in reader:
                    print(row['isbn'])
                                   
            return render(Request,'list.html',{'form':form,})
        else:
            form=ActualizarForm()
            
    
    return render(Request,'list.html',{'form':form})
   
y el error es:

TypeError at /admin/subir/

invalid file: <InMemoryUploadedFile: Libro1.csv (application/vnd.ms-excel)>

agradeceria cualquier ayuda


Saludos,
Gonzalo

francisco del roio

unread,
Oct 14, 2016, 11:01:43 PM10/14/16
to djan...@googlegroups.com
Hola,


Dos cosas:

* El archivo tendrías que tomarlo de form.cleaned_data y no directamente
del request.
* Lo que te pasa el request es un stream ya abierto, no un nombre de
archivo, y lo mismo reza para los archivos en tu modelo y el instanciado
en el form.

Podrías probar a escanear directamente el archivo, de esta manera:

sr=csv.DictReader(archivo,delimiter=';', dialect='excel')

Sin abrir el archivo, porque ya está abierto, solo tenés que escanearlo.

En cualquier caso, podés verificar con un print(archivo).

Si usaras Visual Studio o algún IDE que soporte interrupciones también
podrías parar la ejecución debajo del `if form.is_valid()` y ponerte a
jugar con los objetos que tenés en el request y el form para ver que hay
por ahí.

Saludos,

Gonzalo V

unread,
Oct 15, 2016, 7:11:53 AM10/15/16
to djan...@googlegroups.com

Gracias francisco.
Podrias explicarme en corto que hace "cleaned data"?

saludos,
desde un móvil.

--
--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
 Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
 Para anular la suscripción a este grupo, envíe un mensaje a django-es-unsubscribe@googlegroups.com
 Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
---
Has recibido este mensaje porque estás suscrito al grupo "Django-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a django-es+unsubscribe@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/d/optout.

francisco del roio

unread,
Oct 15, 2016, 7:36:03 AM10/15/16
to djan...@googlegroups.com
Hola,

Cleaned-data contiene los datos validados y transformados a python.

Por ejemplo, te consigue instancias de los modelos en campos ModelSelect y modelSelectMultiple.

Saludos



Enviado desde mi Samsung Mobile de Claro


-------- Mensaje original --------
De: Gonzalo V <gvm...@gmail.com>
Fecha: 15/10/16 8:11 AM (GMT-03:00)
Asunto: Re: [Django-es] leer csv subido

Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com

Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
---
Has recibido este mensaje porque estás suscrito al grupo "Django-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a django-es+...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages