Eu tenho um arquivo composto por duas colunas, ou seja,
1 a
2 b
3 c
Desejo ler este arquivo para um dicionário de forma que a coluna 1 seja a chave e a coluna 2 seja o valor, ou seja,
d = {1:'a', 2:'b', 3:'c'}
O arquivo é pequeno, portanto a eficiência não é um problema.
python
file
dictionary
Darren J. Fitzpatrick
fonte
fonte
with
é usado aqui para lidar com a limpeza do arquivo. Quando você sai do bloco (seja apenas pelo fluxo de execução normal ou por uma exceção), o arquivo será fechado automaticamente. Você pode ler mais sobre gerenciadores de contexto em Python aqui: effbot.org/zone/python-with-statement.htmfor line in open("file.txt"):
faça a limpeza da mesma maneira. E se f for um valor local, of
será liberado quando o escopo for perdido. O único caso em que essa instrução é útil é para função longa (não é boa para qualidade) ou se você usar uma variável global.for line in open('file.txt')
se não fazer a limpeza da mesma maneira. Nem todas as implementações Python são iguais.with
garante que o arquivo será fechado quando o bloco for encerrado. Quando afor
linha estiver completa,close
pode ser chamado.CPython
vai, mas versões comoIronPython
têm coletores de lixo preguiçosos.Isso deixará a chave como uma string:
fonte
dict([line.split() for line in f])
é suficiente, imo.dict([x.rstrip().split(None, 1) for x in f])
vez dedict(x.rstrip().split(None, 1) for x in f)
. Para aqueles que pensam a mesma coisa, a primeira é uma expressão geradora em vez de compreensão de lista, conforme explicado aqui: python.org/dev/peps/pep-0289(PEP-289) . Aprendeu algo novo!Se sua versão python for 2.7+, você também pode usar uma compreensão de dicionário como:
fonte
fonte
partition
? ewith
declaração?partition
é mais rápido e é criado exatamente para esse propósito.with
é uma maneira simples de garantir que sim.strip
, eu diria.Por compreensão de dicionário
Ou por pandas
fonte
IMHO um pouco mais pitônico para usar geradores (provavelmente você precisa de 2.7+ para isso):
Isso também irá filtrar as linhas que não começam com um número inteiro ou não contêm exatamente dois itens
fonte
fonte
re
? seriamente?split()
não funciona quase silenciosamente se o formato do arquivo não for adequado.Se você adora um liners, tente:
Input FILE = Caminho para o arquivo, SEP = caractere separador de valor-chave
Não é a maneira mais elegante ou eficiente de fazer isso, mas muito interessante, no entanto :)
fonte
Aqui está outra opção ...
fonte
Opção Simples
A maioria dos métodos para armazenar um dicionário usa JSON, Pickle ou leitura de linha. Desde que você não esteja editando o dicionário fora do Python, este método simples deve ser suficiente até mesmo para dicionários complexos. Embora Pickle seja melhor para dicionários maiores.
fonte