Mam plik zawierający dwie kolumny, tj.
1 a
2 b
3 c
Chciałbym czytać ten plik do słownika w taki sposób, że kolumna 1 to klucz, a kolumna 2 to wartość, tj.
d = {1:'a', 2:'b', 3:'c'}
Plik jest mały, więc wydajność nie jest problemem.
python
file
dictionary
Darren J. Fitzpatrick
źródło
źródło
with
jest tutaj używany do obsługi czyszczenia pliku. Kiedy opuścisz blok (albo przez zwykły przepływ wykonywania, albo w drodze wyjątku), plik zostanie automatycznie zamknięty. Możesz przeczytać więcej o menedżerach kontekstu w Pythonie tutaj: effbot.org/zone/python-with-statement.htmfor line in open("file.txt"):
czyścić w ten sam sposób. A jeśli f jest wartością lokalną,f
jest zwalniana, gdy zakres zostanie utracony. Jedynym przypadkiem, w którym ta instrukcja jest przydatna, jest długa funkcja (nie dobra ze względu na jakość) lub jeśli używasz zmiennej globalnej.for line in open('file.txt')
czy nie zrobić Cleanup w ten sam sposób. Nie wszystkie implementacje Pythona są takie same.with
gwarantuje, że plik zostanie zamknięty po wyjściu z bloku. Gdyfor
linia jest kompletna,close
można wywołać.CPython
będzie, ale wersje takie jakIronPython
mają leniwe zbieracze śmieci.To pozostawi klucz jako ciąg:
with open('infile.txt') as f: d = dict(x.rstrip().split(None, 1) for x in f)
źródło
dict([line.split() for line in f])
wystarczy, imo.dict([x.rstrip().split(None, 1) for x in f])
zamiastdict(x.rstrip().split(None, 1) for x in f)
. Dla tych, którzy myślą to samo, pierwsze jest wyrażeniem generatora zamiast rozumienia listy, jak wyjaśniono tutaj: python.org/dev/peps/pep-0289(PEP-289) . Nauczyłem się czegoś nowego!Możesz także użyć dyktowania ze zrozumieniem, na przykład:
with open("infile.txt") as f: d = {int(k): v for line in f for (k, v) in [line.strip().split(None, 1)]}
źródło
def get_pair(line): key, sep, value = line.strip().partition(" ") return int(key), value with open("file.txt") as fd: d = dict(get_pair(line) for line in fd)
źródło
partition
? iwith
oświadczenie?partition
jest szybszy i jest stworzony właśnie do tego celu.with
to prosty sposób na zapewnienie, że tak jest.strip
, powiedziałbym.Rozumienie ze słownika
d = { line.split()[0] : line.split()[1] for line in open("file.txt") }
Albo przez pandy
import pandas as pd d = pd.read_csv("file.txt", delimiter=" ", header = None).to_dict()[0]
źródło
IMHO trochę bardziej pythonowe, aby używać generatorów (prawdopodobnie potrzebujesz do tego 2.7+):
with open('infile.txt') as fd: pairs = (line.split(None) for line in fd) res = {int(pair[0]):pair[1] for pair in pairs if len(pair) == 2 and pair[0].isdigit()}
Spowoduje to również odfiltrowanie wierszy, które nie zaczynają się od liczby całkowitej lub nie zawierają dokładnie dwóch elementów
źródło
import re my_file = open('file.txt','r') d = {} for i in my_file: g = re.search(r'(\d+)\s+(.*)', i) # glob line containing an int and a string d[int(g.group(1))] = g.group(2)
źródło
re
? poważnie?split()
nie działa prawie bezgłośnie, jeśli format pliku nie jest rozsądny.Jeśli kochasz one wkładki, wypróbuj:
d=eval('{'+re.sub('\'[\s]*?\'','\':\'',re.sub(r'([^'+input('SEP: ')+',]+)','\''+r'\1'+'\'',open(input('FILE: ')).read().rstrip('\n').replace('\n',',')))+'}')
Plik wejściowy FILE = ścieżka do pliku, SEP = znak separatora klucz-wartość
Nie jest to najbardziej elegancki i skuteczny sposób, ale dość interesujący :)
źródło
Oto inna opcja ...
events = {} for line in csv.reader(open(os.path.join(path, 'events.txt'), "rb")): if line[0][0] == "#": continue events[line[0]] = line[1] if len(line) == 2 else line[1:]
źródło
Prosta opcja
Większość metod przechowywania słownika używa formatu JSON, Pickle lub czytania linii. Zakładając, że nie edytujesz słownika poza Pythonem, ta prosta metoda powinna wystarczyć nawet w przypadku złożonych słowników. Chociaż Pickle będzie lepsza dla większych słowników.
x = {1:'a', 2:'b', 3:'c'} f = 'file.txt' print(x, file=open(f,'w')) # file.txt >>> {1:'a', 2:'b', 3:'c'} y = eval(open(f,'r').read()) print(x==y) # >>> True
źródło
Miałem wymóg, aby pobrać wartości z pliku tekstowego i użyć ich jako pary klucz-wartość. Mam zawartość w pliku tekstowym jako klucz = wartość, więc użyłem metody podziału z separatorem jako "=" i napisałem poniższy kod
d = {} file = open("filename.txt") for x in file: f = x.split("=") d.update({f[0].strip(): f[1].strip()})
Używając metody strip, wszelkie spacje przed lub po separatorze "=" są usuwane, a oczekiwane dane będą miały format słownikowy
źródło
=
znak ``, aby odpowiedzieć na pytanie?