Текстовый файл с несколькими столбцами в словарь

#python #python-3.x #python-2.7 #dictionary #key

#python #python-3.x #python-2.7 #словарь #Клавиша

Вопрос:

Я пытаюсь сделать следующее:

У меня есть файл, который может содержать любое количество строк и столбцов (что означает, что количество строк / столбцов во входном файле не является фиксированным). Также обратите внимание, что могут быть повторяющиеся точки (что допустимо). Формат входного файла выглядит следующим образом:

 Point Sample1_X_Coordinate Sample1_Y_Coordinate Sample2_X_Coordinate Sample2_Y_Coordinate and so on`

A     20                    10                  18                    9

B     16                    13                  15                    13

A     21                    11                  19                    9

C     8                     5                    8                    4
  

Мне нужно сохранить этот файл во что-то вроде следующего для выполнения дополнительных манипуляций (добавление псевдокода, поскольку я новичок в Python):

outputdata[this_sample][this_point].append((this_sample_point_X_coordinate, this_sample_point_Y_coordinate))

то есть данные, которые будут сохранены следующим образом:

 outputdata[Sample1][A] = list[(20,10), (21,11)]

outputdata[Sample2][A] = list[(18,9), (19,9)]
  

Как я могу реализовать вышеуказанное в Python?

Спасибо!

Ответ №1:

это можно сделать, открыв файл, прочитав построчно и разделив строки пробелами. Словарь сложно инициализировать, но с объектами defaultdict это довольно просто. Например:

 from collections import defaultdict

# Instantiate a dictionary which assumes dictionary of lists if the key does not exist
point_dict = defaultdict(lambda: defaultdict(list))
with open('textfile.txt') as f:
    for line in f.readlines():
        # Split line using space as delimeter and remove new line character:
        point, x1, y1, x2, y2 = line.replace('n', '').split(' ')
        point_dict['Sample1'][point].append((int(x1), int(y1)))
        point_dict['Sample2'][point].append((int(x2), int(y2)))
  

Это приводит к:

 point_dict['Sample1']
Out[13]: defaultdict(list, {'A': [(20, 10), (21, 11)], 'B': [(16, 13)], 'C': [(8, 5)]})

point_dict['Sample2']
Out[12]: defaultdict(list, {'A': [(18, 9), (19, 9)], 'B': [(15, 13)], 'C': [(8, 4)]})

point_dict['Sample1']['A']
Out[14]: [(20, 10), (21, 11)]