Można użyć funkcji generatora jak następuje:
def func():
list_of_keys = ['S_Length','S_Width','P_Length','P_Width','Predicate']
with open('example.txt') as f:
for line in f:
yield dict(zip(list_of_keys,line.strip().split(',')))
print(list(func()))
[{'P_Width': '0.2', 'S_Length': '2.1', 'Predicate': 'Iris', 'S_Width': '3.5', 'P_Length': '1.4'}, {'P_Width': '0.2', 'S_Length': '4.9', 'Predicate': 'Ilia', 'S_Width': '3.0', 'P_Length': '1.4'}, {'P_Width': '0.2', 'S_Length': '3.7', 'Predicate': 'Iridium', 'S_Width': '3.2', 'P_Length': '1.3'}]
można odczytać pliku linia po linii i podzielić linie, a następnie utworzyć pary klawiszy i wartości za pomocą funkcji zip
, a następnie przekonwertuj je do słownika.
Należy zauważyć, że ponieważ obiekt pliku to iterator, można iterować po obiekcie pliku i użyć instrukcji with
, aby otworzyć plik, który zamknie plik na końcu bloku.
W innej alternatywnej i bardziej pythonic sposób można również wykorzystać moduł csv
do odczytu pliku tekstowego:
import csv
def func():
list_of_keys = ['S_Length','S_Width','P_Length','P_Width','Predicate']
with open('example.txt') as f:
spamreader = csv.reader(f, delimiter=',')
return [dict(zip(list_of_keys,row)) for row in spamreader]
print func()
Tutaj od csv.reader
akceptuje argumentu separator i zwraca całość swoich linii oddzielone w jednej iterator don” • Potrzeba zapętlenia pliku i podzielenie go ręcznie.
A jeśli chcesz zachować kolejność można użyć collections.OrderedDict
w obu przypadkach:
from collections import OrderedDict
import csv
def func():
list_of_keys = ['S_Length','S_Width','P_Length','P_Width','Predicate']
with open('example.txt') as f:
spamreader = csv.reader(f, delimiter=',')
return [OrderedDict(zip(list_of_keys,row)) for row in spamreader]
print func()
[OrderedDict([('S_Length', '2.1'), ('S_Width', '3.5'), ('P_Length', '1.4'), ('P_Width', '0.2'), ('Predicate', 'Iris')]), OrderedDict([('S_Length', '4.9'), ('S_Width', '3.0'), ('P_Length', '1.4'), ('P_Width', '0.2'), ('Predicate', 'Ilia')]), OrderedDict([('S_Length', '3.7'), ('S_Width', '3.2'), ('P_Length', '1.3'), ('P_Width', '0.2'), ('Predicate', 'Iridium')])]
Dla OP, który wykonuje iteracje nad plik, używając 'range (len())' wymaga to nieco więcej wyjaśnień. – bereal
@bereal Rzeczywiście, właśnie dodałem. – Kasramvd