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.
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.
Odpowiedzi:
d = {}
with open("file.txt") as f:
for line in f:
(key, val) = line.split()
d[int(key)] = val
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.htm
for 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. Gdy for
linia jest kompletna, close
można wywołać. CPython
będzie, ale wersje takie jak IronPython
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)
dict([line.split() for line in f])
wystarczy, imo.
dict([x.rstrip().split(None, 1) for x in f])
zamiast dict(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)]}
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)
partition
? i with
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]
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
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)
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 :)
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:]
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
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
=
znak ``, aby odpowiedzieć na pytanie?