python分割文件行可能每2行并创建字典

时间:2018-04-23 15:20:00

标签: python dictionary split lines

我有一个类似的文件:

AFA MT 0 0  1.22 259 169 FOD 0 50.01 1.3  1.370  0.00  -0.02  1.78 0  0.0
                        S 2 50.620 1.960 2.452 0.00 -0.49 0.31
MKE MS 0 0  4.22 256 149 MDO 1 30.00 1.4  2.370  3.00  -0.52  4.82 0 0.0
KTE KL 0 0  1.22 259 169 FID 0 10.01 2.0  2.470  1.00  -0.12  0.78 1  1.0
                        S 3 70.610 1.960 2.52 0.00 -0.19 0.41
... 
...

S行并不总是存在,但始终以S开头。

我喜欢将它拆分并创建一个字典,其中只有第一个字段(AFA,KTE ......),但也保留“S 2 50.60 ... 0.31”部分作为上一个键的键值,他们存在的时候。 (也就是说,只要它们出现,就将S行与前一行合并)。

到目前为止,我做到了:

import collections
st = {} 
with open("file.txt") as f:
    for line in f:
        if len(line.split())==17 or len(line.split())==8 :
            key, value = line.split(None, 1)
            st[key] = (value.split())
            #order output as the order in file
            st=collections.OrderedDict(st)
            print ([key] ,[value])  

但是这给了我:

['AFA'] ['MT 0 0  1.22 259 169 FOD 0 50.01 1.3  1.370  0.00  -0.02  1.78 0  0.0']
                    ['S'] ['2 50.620 1.960 2.452 0.00 -0.49 0.31']
['MKE'] ['MS 0 0  4.22 256 149 MDO 1 30.00 1.4  2.370  3.00  -0.52  4.82 0 0.0']
['KTE'] ['KL 0 0  1.22 259 169 FID 0 10.01 2.0  2.470  1.00  -0.12  0.78 1  1.0']
                    ['S'] ['3 70.610 1.960 2.52 0.00 -0.19 0.41']

虽然我试着想要得到:

['AFA'] ['MT 0 0  1.22 259 169 FOD 0 50.01 1.3  1.370  0.00  -0.02  1.78 0  0.0 S 2 50.620 1.960 2.452 0.00 -0.49 0.31']
['MKE'] ['MS 0 0  4.22 256 149 MDO 1 30.00 1.4  2.370  3.00  -0.52  4.82 0 0.0']
['KTE'] ['KL 0 0  1.22 259 169 FID 0 10.01 2.0  2.470  1.00  -0.12  0.78 1  1.0 S 3 70.610 1.960 2.52 0.00 -0.19 0.41']

1 个答案:

答案 0 :(得分:0)

您可以使用的逻辑是:

  • 记住你读过的最后一条非S行
  • 如果您阅读了S-line,请将其添加到记忆中的非S系列&把它放在你的字典中,然后忘记记住的非S行
  • 如果您阅读非S行,请将任何记忆中的非S行放入您的词典和&请记住新行
  • 完成文件后,在字典中放入任何记忆的非S行

这似乎可以做你想要的,而不需要对你的尝试进行太多修改:

import pprint
st = {} 
with open("file.txt") as f: 
    for line in f: 
        if len(line.split())==17 : 
            key, value = line.split(None, 1) 
            st[key] = (value.split()) 
        elif len(line.split())==8 : 
            st[key] += line.split()
pprint.pprint(st)