Como fazer UPLOAD de um arquivo via python?

2,472 views
Skip to first unread message

Marcos Vieira

unread,
Apr 10, 2012, 8:50:46 AM4/10/12
to python-brasil
Bom pessoal, Bom dia, minha dúvida agora é de como fazer upload de um
arquivo no python, meu objetivo é criar uma tela que receba um arquivo
xml (Um form simples do input type file HTML) e salve em algum local
para que eu possa fazer a parse desse xml e imprimir na tela os
valores do mesmo, serão 3 passos que o usuário tem que fazer para
receber o valor de seu xml em tabelas na tela,
1º (é o formulário onde ele busca em seus documentos o arquivo e
clicka em enviar).
2º Sem interface (Processamento dos dados e criação da tabela com os
valores de todas tags e filhos de suas respectivas).
3º Impressão na tela (imprimir na tela o arquivo xml processado e em
tabelas).

Não sei se estou conseguindo ser claro, mas minha primeira dúvida é de
como eu salvo esse arquivo que o usuário vai enviar?, onde eu pego
para fazer a parse?
Desde já obrigado pela atenção.

Filipe Cifali

unread,
Apr 10, 2012, 9:21:31 AM4/10/12
to python...@googlegroups.com
Um dos melhores hits de busca do Google: http://www.python.org/doc/essays/ppt/sd99east/sld058.htm

Este exemplo seria o bastante para sua dúvida? (leia os comentários do script)


--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar

<*> Para visitar o site do grupo na web, acesse:
   http://groups.google.com/group/python-brasil

<*> Para sair deste grupo, envie um e-mail para:
   python-brasi...@googlegroups.com

Leonardo Santagada

unread,
Apr 10, 2012, 1:34:48 PM4/10/12
to python...@googlegroups.com
2012/4/10 Marcos Vieira <marcos10...@gmail.com>:

O filipe já respondeu mas eu acho que tu confundiu o pessoal com o
titulo do email. Tu quer saber como fazer uma aplicação web que recebe
um arquivo de uma form, processa esse arquivo e depois mostra o
resultado? Deve ter exemplos disso em django flask e web2py que sejam
fáceis de fazer, procura no google por "python flask file upload" que
aposto que vem algo bom (ou django ou web2py).

--

Leonardo Santagada

Bruno Rocha

unread,
Apr 10, 2012, 2:26:06 PM4/10/12
to python...@googlegroups.com

Exemplo com web2py.


/models/db.py

db = DAL("connection_string")
meus_uploads = db.define_table("uploads", Field("arquivo", "upload", uploadfolder="/caminho/para/salvar"), Field("horaupload", "datetime", default=request.now))


/controllers/default.py

def upload():
    form = SQLFORM(meus_uploads)
    return dict(formulariodeupload=form)


/views/default/upload.html (opcional, se não criar a view ele usará uma view genérica)

{{extend "layout.html"}}
<div>
<h1> Faça o upload! </h1>
{{=formulariodeupload}}
</div>


Acesse: http://localhost:8000/suaapp/default/upload



--

Christian S. Perone

unread,
Apr 10, 2012, 2:45:41 PM4/10/12
to python...@googlegroups.com
Usando Flask e um arquivo só:

https://gist.github.com/2353596

#pip install flask
#python upload.py

--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com



--
"Forgive, O Lord, my little jokes on Thee, and I'll forgive Thy great big joke on me."
http://pyevolve.sourceforge.net/wordpress/

Filipe Cifali

unread,
Apr 10, 2012, 2:55:38 PM4/10/12
to python...@googlegroups.com
Christian, a questão não é por méritos de quantidade de arquivos, o Bruno apenas ofereceu uma solução mais completa, retornando ao db dados sobre o upload para controle (de um possível CMS). Por simplicidade, não é necessário nem de Flask.

2012/4/10 Christian S. Perone <christia...@gmail.com>

Christian S. Perone

unread,
Apr 10, 2012, 3:01:30 PM4/10/12
to python...@googlegroups.com
Filipe, apenas apresentei uma outra alternativa usando um exemplo com o Flask (que ninguém ainda havia apresentado), em nenhum momento citei mérito por quantidade de arquivos. Os moderadores que fiquem a vontade para remover o meu email se ele não contribui em nada.

Bruno Rocha

unread,
Apr 10, 2012, 3:14:42 PM4/10/12
to python...@googlegroups.com
Ok, mal entendido resolvido!! (não vamos transformar isso num flamewar) Peace!

Podemos viver bem em conjunto, por isso criei um mix entre web2py + flask, agora salva no banco e fica tudo num arquivo só vejam!

web2py + flask upload
https://gist.github.com/2353738

Marcos Vieira

unread,
Apr 11, 2012, 9:10:14 AM4/11/12
to python-brasil
problema é que tenho que fazer no framework pyramid, alguma dica?

On 10 abr, 14:34, Leonardo Santagada <santag...@gmail.com> wrote:
> 2012/4/10 Marcos Vieira <marcos100limi...@gmail.com>:

Bruno Rocha

unread,
Apr 11, 2012, 9:43:48 AM4/11/12
to python...@googlegroups.com


2012/4/11 Marcos Vieira <marcos10...@gmail.com>

problema é que tenho que fazer no framework pyramid, alguma dica?

Anderson Cardoso

unread,
Apr 11, 2012, 10:04:45 AM4/11/12
to python...@googlegroups.com
Eu tenho uma dica: ler a documentação e pesquisar no google tendem a ser boas idéias...

abs

Anderson

--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com



--
Anderson Pierre Cardoso
Computer Engineer - University of Sao Paulo

[gtalk]: apierre...@gmail.com
[blog]:  http://anderson-hacklife.blogspot.com/


"FreeSoftware -> free as in freedom"
  |  mande-me documentos em formatos livres (ODF) -> http://www.infowester.com/odf.php

Marcos Vieira

unread,
Apr 11, 2012, 10:37:28 AM4/11/12
to python-brasil
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
import os
import cgi

def hello_world(request):
tagname = request.matchdict['tag']
tagfilho = request.matchdict['tagf']
saida2 = ''' <form action="/tabelas/enviar/teste" method="post"
accept-charset="utf-8"
enctype="multipart/form-data">
<label for="xml">XML</label>
<input id="xml" name="xml" type="file" value="" />
<input type="submit" value="submit" />
</form>'''
filename = request.POST['xml'].filename
input_file = request.POST['xml'].file
file_path = os.path.join('/home/marcosvieira/env', filename)
output_file = open(file_path, 'wb')
input_file.seek(0)
while 1:
data = input_file.read(2<<16)
if not data:
break
output_file.write(data)
output_file.close()
return Response('%s' % saida2)

if __name__ == '__main__':
config = Configurator()
config.add_route('tabelas', '/tabelas/{tag}/{tagf}')
config.add_view(hello_world, route_name='tabelas')
app = config.make_wsgi_app()
server = make_server('0.0.0.0', 8080, app)
server.serve_forever()

esse é meu código e estou tendo o error "KeyError: "No key 'xml': Not
a form request"

On 11 abr, 10:43, Bruno Rocha <rochacbr...@gmail.com> wrote:
> 2012/4/11 Marcos Vieira <marcos100limi...@gmail.com>
>
> > problema é que tenho que fazer no framework pyramid, alguma dica?
>
> http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/for...

Leonardo Santagada

unread,
Apr 11, 2012, 5:20:18 PM4/11/12
to python...@googlegroups.com
On Wed, Apr 11, 2012 at 11:37 AM, Marcos Vieira
<marcos10...@gmail.com> wrote:
> from wsgiref.simple_server import make_server
> from pyramid.config import Configurator
> from pyramid.response import Response
> import os
> import cgi
>
> def hello_world(request):
>    tagname = request.matchdict['tag']
>    tagfilho = request.matchdict['tagf']
>    saida2 = ''' <form action="/tabelas/enviar/teste" method="post"
> accept-charset="utf-8"
>                enctype="multipart/form-data">
>                <label for="xml">XML</label>
>                <input id="xml" name="xml" type="file" value="" />
>                <input type="submit" value="submit" />
>                </form>'''
>    filename = request.POST['xml'].filename
>    input_file = request.POST['xml'].file

no mesmo request que teoricamente mostra o form tu também tenta pegar
os dados por post? Não faz muito sentido. Tem que ter um endereço que
tu manda o form e outro que tu recebe o arquivo (ou um tratamento para
quando é get e outro pra quando é post).

--

Leonardo Santagada

Gustavo Fonseca

unread,
Apr 11, 2012, 7:59:04 PM4/11/12
to python...@googlegroups.com
exato, está faltando um: `if request.method == 'POST':`

Marcos Vieira

unread,
Apr 12, 2012, 9:03:17 AM4/12/12
to python-brasil
Bom, obrigado, funcionou com o if, porém, me deparo com a ideia de que
não preciso salvar
o arquivo(xml), preciso apenas lê-lo para uma variável para poder
fazer a parser futuramente e imprimir na tela.
alguma sugestão? obrigado pela atenção.
Reply all
Reply to author
Forward
0 new messages