ler um arquivo txt e guardá-lo em um dicionário

4,268 views
Skip to first unread message

Raquel N

unread,
Dec 5, 2012, 5:17:23 PM12/5/12
to python...@googlegroups.com
pessoal, to iniciando agora em python e to precisando de um help...!
o problema é: eu preciso criar um arquivo de texto com o nome 'alunos.txt' com a s seguinte informações

Fulano  8.3  7.6  9.5  6.4
Sicrano 5.6  8.9  7.4  7.5
Beltrano 5.6  7.8  9.4  5. 3 
 
e em seguida escrever um programa em python que leia o conteúdo e guarde em um dicionário: Os nomes deverão ser as chaves e as notas armazenadas em listas.
a parte de guardá-lo em um dicionário não deu muito certo..alguém tem noção de como fazer?




Kornél Novák Mergulhão

unread,
Dec 5, 2012, 5:21:35 PM12/5/12
to python...@googlegroups.com
Raquel,

De proposito não escrevo o código aqui :D, assim você aprende mais.

A lógica seria o seguinte: ler linha, split por espaço ler elementos,
e fazer um o método de adicionar no dicionario[nome] por atribuição.

2012/12/5 Raquel N <raquel...@gmail.com>:
> --
> ------------------------------------
> 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

Raquel N

unread,
Dec 5, 2012, 5:27:36 PM12/5/12
to python...@googlegroups.com
arquivo=open('Alunos.txt','r')
linhas=arquivo.readlines()
for linha in linhas:
    alunos=list.split()
    for aluno in alunos:
        print aluno 
arquivo.close()

eu fiz até aqui...mas eu não consigo ler as linhas..esse é o problema

Kornél Novák Mergulhão

unread,
Dec 5, 2012, 5:34:00 PM12/5/12
to python...@googlegroups.com
Raquel,

você tem que identificar o split que no seu caso seria split(" "), o espaço.

2012/12/5 Raquel N <raquel...@gmail.com>:

Raquel N

unread,
Dec 5, 2012, 5:50:26 PM12/5/12
to python...@googlegroups.com
a legal..agora tá dando certo.. e a agora e preciso percorrer as linhas e identificar o nome es notas certo?

Kornél Novák Mergulhão

unread,
Dec 5, 2012, 5:57:16 PM12/5/12
to python...@googlegroups.com
Certo! Como vc fez split nas linhas pode acessar elemento por elemento
a linha e com um ciclo atribuir os elementos na chave certa no
dicionário!

2012/12/5 Raquel N <raquel...@gmail.com>:

Christian S. Perone

unread,
Dec 5, 2012, 6:32:21 PM12/5/12
to python...@googlegroups.com
Se isto não for um exercício apenas, saiba que existem módulos muito bons para fazer o parsing desse tipo de tabela de dados, neste caso [1] estou usando o pandas [2] para ler o alunos.txt neste formato que você enviou, depois fica muito mais simples para manusear os dados, plotar gráficos, etc.




2012/12/5 Kornél Novák Mergulhão <nko...@gmail.com>



--
"Forgive, O Lord, my little jokes on Thee, and I'll forgive Thy great big joke on me."

Raquel N

unread,
Dec 5, 2012, 6:55:04 PM12/5/12
to python...@googlegroups.com


Em quarta-feira, 5 de dezembro de 2012 21h32min21s UTC-2, Christian S. Perone escreveu:
Se isto não for um exercício apenas, saiba que existem módulos muito bons para fazer o parsing desse tipo de tabela de dados, neste caso [1] estou usando o pandas [2] para ler o alunos.txt neste formato que você enviou, depois fica muito mais simples para manusear os dados, plotar gráficos, etc.



 pessoal..obrigada pela ajuda!..vlw mesmo!



Kornél Novák Mergulhão

unread,
Dec 5, 2012, 6:58:23 PM12/5/12
to python...@googlegroups.com
Raquel,

Qualquer coisa só postar!

2012/12/5 Raquel N <raquel...@gmail.com>:

Filipe Cifali

unread,
Dec 5, 2012, 7:03:30 PM12/5/12
to python...@googlegroups.com
Raquel, você precisa manipular os dados na forma de linha para poder criar key:value

Se você fizer for aluno in alunos, terá em cada laço, uma "key" sem "value" resgatado. No seu caso, sugiro andar por indices dentro da lista. 
[ ]'s

Filipe Cifali Stangler

rcovre

unread,
Dec 5, 2012, 8:26:46 PM12/5/12
to python...@googlegroups.com
Olá, Raquel,

tudo bem? Problemas como esse eu lido praticamente todo dia no meu trabalho. Também não vou postar o código, mas se você usar o módulo interno do Python chamado csv [1] você consegue resolver esse problema praticamente em uma linha. Dica: eu usaria o recurso 'dict comprehension' [2].

Té mais

rodrigo koblitz

unread,
Dec 5, 2012, 8:50:56 PM12/5/12
to python...@googlegroups.com
Buenos,
estou passando por essa questão. Vou postar o código porque está gigante e deve ter muita coisa que deve ser feito de forma diferente, mas dá uma do passo a passo (se alguém se dispor a critica-lo será bem vindo). O código não é exatamente esse porque tem umas partes que vem de outras funções, mas ficaria meio enfadonho colocar tudo.

def importgeral(request, empree=None, modd=None, cab=None, ca=None):
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        empreestr=str(empree)
        if form.is_valid():
            newdoc = Document(docfile = request.FILES['docfile'])
            newdoc.save()
            doc=open(newdoc.docfile.path, 'r')
            doc=doc.readlines();
            # correcao para tirar linhas nulas do doc 
            doc1=[a for a in doc if a != '\n']
            doc2=[]
            for i in doc1:
                g=list(i.split(','))
                b=[]
                for ii in enumerate(g):
# esse enumerate te dá uma tupla como resultado e o interessante é que se pode modificar uma deteminada #coluna. Mas é meio hard code.....
                    if ii[0]==0:
                        try:
                            b.append(GradesModulos.objects.get(abrev__iexact=ii[1], empreendimento__empreendimento=empree).id)
                        except:
                            print 'erro na consulta no GradesModulos'
                    else:
                        b.append(ii[1])
                doc2.append(b)
            dt1={}
            # ca --> é o cabecalho. o arquivo .csv que recebo é sem cabeçalho e ele é uma consequencia de #uma outra consulta..., mas é uma lista.
            for v,i in enumerate(doc2):
                dt1['line%s'%v]=dict(zip(ca,i))
    return dt1


abs,
Koblitz

rcovre

unread,
Dec 5, 2012, 9:22:38 PM12/5/12
to python...@googlegroups.com
Oi, koblitz,

tudo bem? Achei muito interessante seu código (ele está integrado com Django, né? É algo que eu gostaria de aprender um dia desses =D). Não tenho muito a acrescentar no seu código, mas me parece que você não fechou o arquivo que você abriu em 'doc' (linha 8).
Bom, vou abrir o jogo, inclusive porque eu gostaria de saber se é uma boa maneira de se resolver esse problema (pythônica talvez?). Eu faria da seguinte maneira:

Supondo um arquivo chamado 'alunos.txt' com o conteúdo (separado por um espaço cada campo)

Fulano 8.3 7.6 9.5 6.4
Sicrano 5.6 8.9 7.4 7.5
Beltrano 5.6 7.8 9.4 5.3

O código seria esse:

import csv

with open('alunos.txt', 'U') as alunos:
    alunos_data = {aluno[0]: aluno[1:] for aluno in csv.reader(alunos, delimiter=' ') if aluno}

O 'if aluno' no final do 'dict comprehension' é para pular linha vazias.

O dicionário 'alunos_data' fica assim:

{'Beltrano': ['5.6', '7.8', '9.4', '5.3'],
 'Fulano': ['8.3', '7.6', '9.5', '6.4'],
 'Sicrano': ['5.6', '8.9', '7.4', '7.5']}

Té mais
Rafael

Flávio Casacurta

unread,
Dec 5, 2012, 10:32:53 PM12/5/12
to python...@googlegroups.com
Trabalho com grandes volumes de textos, e achei interessante manipular dados em matrizes multi dimensionais com o pandas.
Atualmente eu mesmo construo dicionários compostos por listas, tuplas, sets  e outros dicionários...
Instalei o pandas o NumPy e o python-dateutil ao tentar um import  está ocorrendo um erro no __init__ do pandas
>>> from pandas import *
No module named dateutil.parser
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\pandas\__init__.py", line 10, in <module>
    import pandas.lib as lib
  File "datetime.pyx", line 13, in init pandas.lib (pandas\src\tseries.c:136192)

ImportError: No module named dateutil.parser
>>>
Não encontrei no C:\Python27\Lib\site-packages\pandas o pandas.lib
Não achei referência a este erro no Google
Coloquei python-dateutil no  site-packages 

Alguém sabe o caminho das pedras?

Flávio Casacurta

unread,
Dec 5, 2012, 11:10:37 PM12/5/12
to python...@googlegroups.com
Pessoal, resolvi o problema.

Coloquei C:\Python27\Lib\site-packages\python-dateutil-1.5 no PYTHONPATH

Flávio

rodrigo koblitz

unread,
Dec 6, 2012, 12:42:07 AM12/6/12
to python...@googlegroups.com
Olá rcovre,
sim, é django.
 sobre fechar o 'doc', como só uso ele uma vez e o transformo em outras coisas, não reutilizando-o, não sei se é preciso. Talvez seja recomendável... Aqui tá funcionando sem erro, mas não tá em produção ainda.

abs,
Koblitz

Vinicius Assef

unread,
Dec 6, 2012, 6:17:39 AM12/6/12
to python...@googlegroups.com
Raquel, sugiro não ler o arquivo dessa forma, com open() e close().
Essa é a maneira antiga de se fazer isso em Python.

O jeito mais seguro, que garante que seu arquivo não ficará travado em
caso de problema na leitura, está expicado num post que escrevi a
partir justamente de uma conversa aqui na lista, em 2010.

Veja o mesmo: http://aprenda-python.blogspot.com.br/2010/09/garanta-o-fechamento-dos-arquivos.html

--
Vinicius Assef



2012/12/5 Raquel N <raquel...@gmail.com>:

Christian S. Perone

unread,
Dec 6, 2012, 6:43:28 AM12/6/12
to python...@googlegroups.com
Oi Vinicius, se o arquivo ficar travado com o uso correto de open/close o uso do with não vai resolver o problema. O uso do open/close não é de forma alguma "a maneira antiga", o uso de open/close é recomendado também pela documentação oficial das versões 2.x e 3.x do Python. O uso do 'with' é só uma outra forma de se fazer isto.


2012/12/6 Vinicius Assef <vinic...@gmail.com>



--

Vinicius Assef

unread,
Dec 6, 2012, 7:27:41 AM12/6/12
to python...@googlegroups.com
Oi Christian, exatamente por causa da documentação oficial foi que eu
entendi que esse seria um jeito mais seguro de ler arquivos em Python.

Talvez o termo correto não seja "um jeito novo", mas "uma melhor
prática", o que significa "um jeito melhor". Veja esse trecho da
documentação tanto do Python 2, como do Python 3 [1]:

--------- início ----------
It is good practice to use the with keyword when dealing with file
objects. This has the advantage that the file is properly closed after
its suite finishes, even if an exception is raised on the way. It is
also much shorter than writing equivalent try-finally blocks:
>>>

>>> with open('/tmp/workfile', 'r') as f:
... read_data = f.read()
>>> f.closed
True
----------- fim ----------

[1] http://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files

--
Vinicius Assef


2012/12/6 Christian S. Perone <christia...@gmail.com>:

Mário Neto

unread,
Dec 6, 2012, 2:30:40 PM12/6/12
to python...@googlegroups.com
Por coincidência, esses dias escrevi um programinha pra verificar reincidência de números e alguns outros testes em um arquivo que baixei da loteria com todos os jogos e nesse código tem algumas manipulações de arquivos, listas e dicionários, usei alguns módulos que eu não conhecia para estudo, segue o gist e um link para o download do arquivo de teste no comentário do gist.
Att. Mário Araújo Chaves Neto
Programmer, Designer and U.I. Engineer

MBA in Design Digital - 2008 - FIC
Analysis and Systems Development - 2011 - Estácio
Design and Implementation of Internet Environments - 2003 - FIC

Raquel N

unread,
Dec 7, 2012, 1:27:24 PM12/7/12
to python...@googlegroups.com
PESSOAL eu consegui escrever esse código..no entanto o programa roda mas imprime apenas a última linha do arquivo txt, eu não consegui identificar o erro ainda...alguém tem alguma ideia?

CÓDIGO

arquivo=open('alunos.txt','r')
linhas=arquivo.readlines()
for linha in linhas:
    alunos=linha.split()
diario=dict()
nome=alunos[0]
nota=alunos[1:5]
diario[nome]=nota
print diario
arquivo.close()

#{'BELTRANO': ['8.3', '5.0', '6.0', '7.0']}-RESPOSTA QUE OBTIVE
#CONSEGUI GUARDAR O ARQUIVO EM UM DICIONÁRIO, NO ENTANTO, QUANDO EU RODO O PROGRAMA,
#ELE IMPRIME APENAS A ÚLTIMA LINHA, QUERIA QUE ELE IMPRIMISSE OS TRÊS NOMES E AS 12 NOTAS CONFORME O ARQUIVO (alunos.txt)

ARQUIVO-'alunos.txt' 

Maxwell Morais

unread,
Dec 7, 2012, 1:33:04 PM12/7/12
to python...@googlegroups.com
Raquel, querida!
A questão é simples, python lida com blocos de identação para determinar os fluxos de execução do código, e alguns elementos do seu código estão fora do bloco for:
ao invés de :

for linha in linhas:
    alunos=linha.split()
diario=dict()
nome=alunos[0]
nota=alunos[1:5]
diario[nome]=nota
print diario

tente:

for linha in linhas:
    alunos=linha.split()
    diario=dict()
    nome=alunos[0]
    nota=alunos[1:5]
    diario[nome]=nota
    print diario

Em 7 de dezembro de 2012 16:27, Raquel N <raquel...@gmail.com> escreveu:
diario=dict()
nome=alunos[0]
nota=alunos[1:5]
diario[nome]=nota
print diario



Filipe Cifali

unread,
Dec 7, 2012, 1:34:51 PM12/7/12
to python...@googlegroups.com
Dê uma lida neste artigo que ele pode lhe ajudar com diversas formas de manipular dicionários:

http://yuji.wordpress.com/2008/05/14/python-basics-of-python-dictionary-and-looping-through-them/


Em 7 de dezembro de 2012 16:27, Raquel N <raquel...@gmail.com> escreveu:

--
------------------------------------
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



--
[ ]'s

Filipe Cifali Stangler

luan fonceca

unread,
Dec 7, 2012, 1:39:05 PM12/7/12
to python...@googlegroups.com
Ou então, acho que isso dá certo, não testei:

alunos = []
for linha in linhas:
    aluno = linha.split()

    nome = aluno[0]
    notas = aluno[1:5]

    alunos.append({
        'aluno': nome,
        'notas': notas
    })

# Lista de dicionários, formados pela chave sendo o nome do aluno e os valores são as notas
print alunos 


Em 7 de dezembro de 2012 15:33, Maxwell Morais <max.mor...@gmail.com> escreveu:
for linha in linhas:
    alunos=linha.split()
    diario=dict()
    nome=alunos[0]
    nota=alunos[1:5]
    diario[nome]=nota
    print diario



--
  • Software Engineering student at the Universidade Federal do Rio Grande do Norte;
  • Front-end Designer and Developer;
  • Python/Django Developer at the multmeio.com.br.

Raquel N

unread,
Dec 7, 2012, 1:41:41 PM12/7/12
to python...@googlegroups.com
VLW!!...meeu agora deu certo, muito obrigada mesmo, =-{ foi um erro de iniciante...

Raquel N

unread,
Dec 7, 2012, 1:42:53 PM12/7/12
to python...@googlegroups.com
VLW pela dica!=-)

Christian S. Perone

unread,
Dec 7, 2012, 1:49:32 PM12/7/12
to python...@googlegroups.com
Raquel, outra alternativa se vc estiver interessada: https://gist.github.com/4235462


2012/12/7 Raquel N <raquel...@gmail.com>



--

Raquel N

unread,
Dec 7, 2012, 1:55:33 PM12/7/12
to python...@googlegroups.com
Que Legal! Deu certo também, e ficou muito mais prático..muito obrigada =-)

Alysson Bruno

unread,
Dec 5, 2012, 5:27:16 PM12/5/12
to python-brasil
É mais ou menos assim: https://gist.github.com/4220070

paz e amor (love and peace),

Alysson Bruno
===============================================
Palmas(TO)
Brasil

Blog: http://abruno.com


=================================================================
Meu alterego Escritor:

Leia alguns contos que escrevo, não esqueça de me dar sua opinião: http://goo.gl/Wjn4p

=================================================================



2012/12/5 Kornél Novák Mergulhão <nko...@gmail.com>
Raquel,


De proposito não escrevo o código aqui :D, assim você aprende mais.

A lógica seria o seguinte: ler linha, split por espaço ler elementos,
e fazer um o método de adicionar no dicionario[nome] por atribuição.

2012/12/5 Raquel N <raquel...@gmail.com>:
> pessoal, to iniciando agora em python e to precisando de um help...!
> o problema é: eu preciso criar um arquivo de texto com o nome 'alunos.txt'
> com a s seguinte informações
>
> Fulano  8.3  7.6  9.5  6.4
> Sicrano 5.6  8.9  7.4  7.5
> Beltrano 5.6  7.8  9.4  5. 3
>
> e em seguida escrever um programa em python que leia o conteúdo e guarde em
> um dicionário: Os nomes deverão ser as chaves e as notas armazenadas em
> listas.
> a parte de guardá-lo em um dicionário não deu muito certo..alguém tem noção
> de como fazer?
>
>
>
>

Mário Neto

unread,
Dec 7, 2012, 5:36:51 PM12/7/12
to python...@googlegroups.com
Bem elegante a solução do Christian, apesar do dict comprehension está bem legível

Wallacy Rezende

unread,
May 21, 2015, 9:34:53 AM5/21/15
to python...@googlegroups.com, nko...@gmail.com
  Galera bom dia!

  Estou tendo um problema para ler um arquivo de configuração externo com o python.

  Quero guardar as informações de conexão do meu banco de dados neste arquivo e então chama-lo para minha função em python.

  Só que o problema é que quando leio o arquivo, ele não me retorna um dicionário.

  Queria saber se tem algum modo que eu possa fazer para me retornar um dicionário.

Utilizo o Python 3.4 e meu código é o seguinte: 
#função para conectar no banco de dados
def connection():
try:
user = open('C:Users\suporte.ti\Desktop\db.config').readline().splitlines()
global conn
global cursor
conn = mysql.connector.connect(**user)
cursor = conn.cursor()
except mysql.connector.Error as err:
print("Error occurred: {}".format(err))

Victor Augusto Furtado Leite

unread,
May 21, 2015, 9:52:09 AM5/21/15
to python...@googlegroups.com
Wallacy, você pode usar os módulos json, pickle ou até mesmo o shelve.

Mas pelo que parece você não precisa armazenar objetos complexos, então, eu aconselharia usar json.

[]s


--
--
------------------------------------
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

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Victor Augusto Furtado Leite

bleno nascimento

unread,
May 21, 2015, 10:16:46 AM5/21/15
to python...@googlegroups.com
Wallacy, 

Pelo que vi, você esta querendo ler um arquivo de configurações e passar como parâmetro.

Acho interessante tentar usar o módulo  configparser[1]


[1]https://docs.python.org/3/library/configparser.html
Atenciosamente,

Bleno N. Silva -- 
Desenvolvedor Web


Reply all
Reply to author
Forward
0 new messages