解析srtructure文件Python

问题描述 投票:-1回答:2

我想了解在Python中使用构造Case的特性。我有一个以下类型的文本文件:

Head 1
a 10
a 14
a 15
Head 4
a 32
a 55
a 79
Head 53
a 22
a 33
Head 33
a 11
a 66
Head 32
a 88
a 89
a 88
End

我想解析并将此文件结构化到下一个平面:

Head 1, a 10
Head 1, a 14
Head 1, a 15
Head 4, a 32
Head 4, a 55
Head 4, a 79
Head 53, a 22
Head 53, a 33
Head 33, a 11
Head 33, a 66
Head 32, a 88
Head 32, a 89
Head 32, a 88

当我开始学习Python时,我学到的第一件事就是缺少这种情况。

我尝试的方式:

array = []
with open('C:/file/1.txt') as f:
 for line in f:
  if line[0:4] == 'Head':
   Header = line
   print(Header)
  elif line[0:1] == 'a':
   Subheader = line
   print(Subheader)
  else:
   continue

是否可以使用此方法以所需格式分解数据?谢谢

python parsing if-statement case-when
2个回答
2
投票

假设您的文件名为filename.txt

>>> with open('filename.txt', 'r') as f:
...     current_head = None
...     result = []
...     for line in f:
...         if line.startswith('End'):
...             break
...         elif line.startswith('Head'):
...             current_head = line.rstrip()
...         else:
...             result.append('{}, {}'.format(current_head, line.rstrip()))
... 
>>> for line in result:
...     print(line)
... 
Head 1, a 10
Head 1, a 14
Head 1, a 15
Head 4, a 32
Head 4, a 55
Head 4, a 79
Head 53, a 22
Head 53, a 33
Head 33, a 11
Head 33, a 66
Head 32, a 88
Head 32, a 89
Head 32, a 88

1
投票

你可以使用itertools.groupby

import itertools
data = [i.strip('\n').split() for i in open('filename.txt')][:-1]
s = [list(b) for _, b in itertools.groupby(data, key=lambda x:x[0] == 'Head')]
new_s = [s[i]+s[i+1] for i in range(0, len(s), 2)]
final_s = [[i[0]+b for b in i[1:]] for i in new_s]
with open('filename1.txt', 'a') as f:
  for row in final_s:
    for i in row:
      f.write('{} {}, {} {}\n'.format(*i))

输出:

Head 1, a 10
Head 1, a 14
Head 1, a 15
Head 4, a 32
Head 4, a 55
Head 4, a 79
Head 53, a 22
Head 53, a 33
Head 33, a 11
Head 33, a 66
Head 32, a 88
Head 32, a 89
Head 32, a 88
© www.soinside.com 2019 - 2024. All rights reserved.