попытка создать список словарей из текстового файла

#python #list #dictionary

#python #Список #словарь

Вопрос:

Итак, у меня есть этот текстовый файл, который содержит эту информацию:

 rect 20 20 80 50 True
tri 80 50 20 35 False
 

Что я хочу сделать, так это написать функцию для чтения типа и координат фигуры из текстового файла и возврата результатов в виде списка:

 readShapes('test.txt')
[{'kind': 'rect', 'bounds': [20, 20, 80, 50], 'fill': True}, {'kind': 'tri', 'bounds': [80, 50, 20, 35], 'fill': False}]
 

Я попробовал это (конечно, это неэффективно, но пока я просто пытаюсь быть преднамеренным в процессе кодирования):

 # reads a file and returns a corresponding list of shapes
def readShapes(filename):
    my_file = open(filename, 'r')
    lines = my_file.readlines()
    fieldnames = ["kindVal", "x0", "y0", "x1", "y1", "fillVal"]
    results = []
    for line in my_file:
        dictionary = {}
        fields = line.split(" ")
        for i in range(6):
            kindVal = str(fieldnames[0])
            x0 = int(fieldnames[1])
            y0 = int(fieldnames[2])
            x1 = int(fieldnames[3])
            y1 = int(fieldnames[4])
            fillVal = str(fieldnames[5])
            shape = {'kind': kindVal, 'bounds': [x0, y0, x1, y1], 'fill': fillVal}
        results.append(dictionary)
    print(results)
    return results
 

Ответ №1:

Вы могли бы использовать расширенную итеративную распаковку:

 res = []
with open('data.txt') as infile:
    for line in infile:
        kind, *bounds, fill = line.split()
        res.append({'kind': kind, 'bounds': bounds, 'fill': fill})
print(res)
 

Вывод

 [{'kind': 'rect', 'bounds': ['20', '20', '80', '50'], 'fill': 'True'}, {'kind': 'tri', 'bounds': ['80', '50', '20', '35'], 'fill': 'False'}]
 

Если ключ заполнения должен быть логическим, вы могли бы сделать вместо этого:

 res.append({'kind': kind, 'bounds': bounds, 'fill': bool(fill == 'True')})
 

Или, возможно, более безопасный:

 # from ast import literal_eval
res.append({'kind': kind, 'bounds': bounds, 'fill': literal_eval(fill)})
 

Комментарии:

1. Большое вам спасибо! Чтобы уточнить, *bounds выбираются значения всего, что не включено в другие ключи, например, пара «первый, остальные», да?