Jump to content

[Resolvido] Colocar dados de uma variável num dicionário


gonca16
 Share

Recommended Posts

Ola

Estou a iniciar um projecto em que agr tenho de ler um ficheiro por tanto eu li o ficheiro e coloquei o conteudo numa varivavel "content".

Conteudo da variavel:

Alberto Campos, 09:25, 01:50

Carlos Castro, 09:00, 01:45

Duarte Silva, 09:15, 02:27

Jonas Sousa, 09:20, 01:00

Como é que eu a partir de aqui consigo colocar num dicionario como key o nome e como valor as horas numa listas por exemplo:

d={"Alberto Campos":[09:25, 01:50]

Já agora quando eu leio do ficheiro é um txt ele ja vem assim com espaço entre as linhas existe alguma maneira de eu conseguir tirar o espaço entre cada linha?

Desde já obrigado

Edited by pwseo
code tags, syntax highlight.
Link to comment
Share on other sites

Quando lês o conteúdo do ficheiro podes excluir as linhas em branco analisando se o seu conteúdo é apenas "\n". Não sei o método que estás a usar para ler o ficheiro, pelo que não posso dar uma dica mais precisa em termos de código.

Acerca da transformação da lista em dicionário, basta usar a forma como os dicionários são construídos:

d = {}
d['coisas'] = [1,2,3]
print(d)
# Output: {'coisas': [1, 2, 3]}

Tendo uma lista com a forma...

['coisas', 1, 2, 3]

...podemos extrair as respectivas partes usando slicing.

Knowledge is free!

Link to comment
Share on other sites

Sim eu sei mas assim eu estou a criar um dicionario com esse valores eu quero criar o dicionario conforme o que estas escrito no ficheiro.

O codigo todo é :

driversfp = open("drivers0911.txt", "r")
driversDict={}
content=driversfp.read()
print content

Agora eu queria criar o dicionario conforme o conteudo do ficheiro a key com o nome e o valor com as horas

Obrigado

Edited by thoga31
Tags code + GeSHi
Link to comment
Share on other sites

Eu não sabia como tinhas os dados guardados após a leitura, daí ter feito a minha resposta com base no pressuposto que já tinhas tudo em listas e referindo claramente que não sabia o teu método de leitura.

Agora que sei, posso dar novas dicas mais orientadas. Conselho para o futuro: contar a história toda logo no início e não apenas dizer que o príncipe beijou o sapo. Nós precisamos de saber como chegámos a esse ponto 😉

Posto isto, eu mudava o método de leitura do ficheiro para uma list comprehension uma vez que podes logo filtrar o conteúdo do ficheiro e eliminar as linhas em branco. Um exemplo:

f = open("ola.txt", 'r')
content = [line for line in f.readlines() if line != "123\n"]
         # Exclui todas as linhas cujo conteúdo seja exactamente "123\n"

Após esta filtração aquando da leitura do ficheiro, ficarás com o conteúdo assim:

["Alberto Campos, 09:25, 01:50", "Carlos Castro, 09:00, 01:45", ...]

Ora, podemos fazer uma divisão das strings usando o método split:

texto.split(", ")

E ficarás com isto:

[["Alberto Campos", "09:25", "01:50"], ["Carlos Castro", "09:00", "01:45"], ...]

Este método pode ser aplicado logo na list comprehension, o que te vai poupar linhas de código e fazer tudo num só passo.

A partir daqui, usas aquilo que já indiquei para construir o dicionário.

Se tiveres alguma dúvida específica em qualquer um dos passos, diz 😉

Cumprimentos.

Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

l = [x**2 for x in range(10)]
#    ----
#      ^
#      |
#      |
#    This!

Como podes ver, na list comprehension podemos modificar o resultado naquele ponto.

Agora, pegando nisto...

content = [line for line in f.readlines() if line != "123\n"]

... onde achas que poderás aplicar o split?

Claro que para conseguires responder a esta questão, convém perceberes o que esta linha de código significa no seu todo e o que é o conceito de list comprehension. Caso nunca tenhas visto isto na tua vida e/ou não compreendas alguma parte dela, por favor diz que é para eu explicar e não estares apenas a usar coisas que nunca aprendeste.

Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

Como alternativa, podemos utilizar apenas um ciclo e condições para filtrar as linhas que queremos (até evitamos o passo de construir em memória uma lista de linhas válidas):

# assumindo que f é o ficheiro já aberto
for l in f:
   if l.strip() != '':
       # aqui fazes o que quiseres com l
       # ...

Aconselho também a utilização das estruturas de controlo with para abrir e fechar o ficheiro de texto, que te poupam a linha final com f.close() (muitas vezes esquecida):

with open('drivers0911.txt') as f:
   # e aqui trabalhas com f
   # ...

E já agora, uma vez que estás a utilizar Python 2 (porque não o 3?), se quiseres que o teu código fique mais compatível com Python 3 podes sempre utilizar os future statements, assim:

# No topo do ficheiro
from __future__ import print_function

print("Isto é correcto")
print "Isto é um erro"    # sintaxe inválida

Mas isto fica para outra conversa, provavelmente.

Link to comment
Share on other sites

Obrigado pela explicação da list comprehension ja me esta a ser bastante util

consegui ja entendi fiz assim

content=[line.split(", " ) for line in driversfp.readlines() if line != "\n"]

realmente foi má comprensao minha, mas no resultado ele dividio em listas separadas mas no final de cada uma continua a aparecer o \n é normal?

Edited by thoga31
Tags code + GeSHi
Link to comment
Share on other sites

(...) no resultado ele dividio em listas separadas mas no final de cada uma continua a aparecer o \n é normal?

Sim. O teu código ignora todas as linhas que contenham apenas '\n', mas não o elimina das outras linhas. Existem várias formas de contornar o problema, mas uma delas é aplicar a função strip() antes de split(", "), ou seja:

content = [ line.strip().split(", ") for line in driversfp.readlines() if line != '\n' ]

Um aparte: pessoalmente, penso que utilizar uma lista por compreensão neste caso não é a abordagem mais legível (ou eficiente) e, tendo em conta que estás a utilizar Python 2, não é também a abordagem mais segura devido ao bug explicado neste post do StackOverflow, especialmente se és novo na linguagem (uma alternativa válida seriam as generator expressions).

Link to comment
Share on other sites

Bom o que se passa agora é o seguinte o programa ficou assim:

driversfp = open("drivers0911.txt", "r")
driversDict={}
for i in range(0,14,1):
   driversfp.readline()
content=[line.strip().split(", " ) for line in driversfp.readlines() if line != "\n"]    
print content
print
driversDict={content[0][0]:[content[0][1],content[0][2]],content[1][0]:[content[1][1],content[1][2]],content[2][0]:[content[2][1],content[2][2]],content[3][0]:[content[3][1],content[3][2]]}
print driversDict
driversfp.close()

no entanto isto so le aquele ficheiro drivers e se o ficheiro mudar e tiver mais drivers do que aquele ele ja nao vai adicionar esse ao dicionario alguma ideia de como resolvo isso

Edited by pwseo
syntax highlight.
Link to comment
Share on other sites

Company:

taco-a-taco

Day:

09:11:2015

Period:

09:00 - 11:00

Drivers:

Alberto Campos, 09:25, 01:50

Carlos Castro, 09:00, 01:45

Duarte Silva, 09:15, 02:27

Jonas Sousa, 09:20, 01:00

Este é exatamente o conteudo do ficheiro que eu leio o primeiro for é simplemente para ele nao ler o cabeçalho e começar logo a ler o que é realmente necessário, mas isto funciona para este ficheiro imaginamdo que o ficheiro tinha mais um driver o meu programa ja nao iria ler porque apenas esta preparado para aquele numero de drivers e o programa tem de funcionar com qualquer ficheiro e nao apenas com um

Edited by pwseo
tags de código.
Link to comment
Share on other sites

Começa a tornar-se chato ter que editar os teus posts para colocar as tags apropriadas, por isso começa a colocá-las quando os escreves.

Relativamente ao teu problema, consegues fazer isso correctamente se adicionares cada driver ao dicionário dentro de um ciclo.

Breve exemplo:

for d in content:
   # aqui adicionas o driver a 'driversDict' tendo
   # em conta que 'd' é uma lista com 3 elementos
   # ...
Edited by pwseo
adicionado exemplo.
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.