Как разобрать текстовый файл в словарь в python с ключом в одной строке, за которой следуют две строки значений - PullRequest
2 голосов
/ 18 июня 2020

У меня есть файл со строками в этом формате:

CALSPHERE 1             
1 00900U 64063C   20161.15561498  .00000210  00000-0  21550-3 0  9996
2 00900  90.1544  28.2623 0029666  80.8701  43.4270 13.73380512769319
CALSPHERE 2             
1 00902U 64063E   20161.16836122  .00000025  00000-0  23933-4 0  9990
2 00902  90.1649  30.9038 0019837 126.9344   3.6737 13.52683749559421

.. et c.

Я хотел бы разобрать это в словарь формата:

{CALSPHERE 1:(1 00900U 64063C   20161.15561498  .00000210  00000-0  21550-3 0  9996, 2 00900  90.1544  28.2623 0029666  80.8701  43.4270 13.73380512769319),
CALSPHERE 2:(1 00902U 64063E   20161.16836122  .00000025  00000-0  23933-4 0  9990, 2 00902  90.1649  30.9038 0019837 126.9344   3.6737 13.52683749559421),...}

Я озадачен тем, как это проанализировать, чтобы каждая третья строка была ключом, а следующие две строки образуют кортеж для значения. Как лучше всего сделать это в python?

Я попытался добавить несколько logi c для «каждой третьей строки», хотя это кажется запутанным; что-то вроде

    with open(r"file") as f:
        i = 3
        for line in f:
             if i%3=0:
                key = line
             else:
                #not sure what to do with the next lines here

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Если ваш файл всегда имеет одно и то же распределение (то есть: слово «CALSPHERE» - или любое другое, которое вы хотите использовать в качестве ключа словаря -, за которым следуют две строки), вы можете добиться желаемого, выполнив следующие действия. :

with open(filename) as file:
    lines = file.read().splitlines()
    d = dict()
    for i in range(0, len(lines), 3):
        d[lines[i].strip()] = (lines[i + 1], lines[i + 2])

Вывод:

{
    'CALSPHERE 1': ('1 00900U 64063C   20161.15561498  .00000210  00000-0  21550-3 0  9996', '2 00900  90.1544  28.2623 0029666  80.8701  43.4270 13.73380512769319'),
    'CALSPHERE 2': ('1 00902U 64063E   20161.16836122  .00000025  00000-0  23933-4 0  9990', '2 00902  90.1649  30.9038 0019837 126.9344   3.6737 13.52683749559421')
}
0 голосов
/ 18 июня 2020

Предполагая, что ваш контент находится в file.txt, вы можете использовать следующее. Он должен работать для любого количества вхождений ключевого слова CALSPHERE, а также для различного количества записей между.

with open('file.txt') as inp:
    buffer = []
    for line in inp: 
        # remove newline
        copy = line.replace('\n','')
        # check if next entry
        if 'CALSPHERE' in copy:
            buffer.append([]) 
        # add line
        buffer[-1].append(copy)
    # put the output into dictionary
    res = {}
    for chunk in buffer:  
        # safety check
        if len(chunk) > 1:
            res[chunk[0]] = tuple( chunk[1:] ) 
    print(res)
...