Вы можете использовать функцию генератора, как следующее:
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'}]
вы можете прочитать файл построчно и разделить строки, а затем создать пары ключей и значений, используя функцию zip
, а затем преобразуйте их в словарь.
Обратите внимание, что поскольку файловый объект является итератором, вы можете перебирать свой файловый объект и использовать оператор with
, чтобы открыть файл, который закроет файл в конце блока.
В качестве другого альтернативных и более вещий образом вы можете также использовать csv
модуль для чтения текстового файла:
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()
Вот так csv.reader
принимает разделители аргумент и возвращает целое ваших строк, разделенное в одном итераторе вы не» t нужно зациклиться на вашем файле и разбить его вручную.
И если вы хотите, чтобы сохранить порядок, вы можете использовать collections.OrderedDict
в обоих случаях:
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')])]
Для О.П., который перебирает файл, используя 'range (len())' this требует _a бит больше_ объяснения. – bereal
@bereal Действительно, я только что добавил. – Kasramvd