解析结构化文件Python

解析结构化文件Python,python,parsing,if-statement,case-when,Python,Parsing,If Statement,Case When,我想了解在Python中使用构造用例的特殊性。 我有以下类型的文本文件: 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,

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

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的时候,我学到的第一件事是,当我开始学习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
是否可以使用此方法将数据分解为所需的格式?
谢谢

您可以使用
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

假设您的文件名为
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

为什么不试一试呢?我不是在看问题,答案提供了一个我将使用的技巧…:-)这是此解决方案输出的第一行:
['Head','1']['a','10']['a','14']['a','15']
索引器:元组索引超出范围
您使这种方法变得比需要的更复杂be@Ajax1234你真的没有做很多测试,是吗?在模式中使用
a
会反复附加到同一文件。我只是复制/粘贴您的代码并每次运行它。不是用
w
创建新文件,而是每次用
a
附加到上一个文件。我刚刚写了一个几乎相同的解决方案,你比我快了几秒钟。只是一个简单的建议:我会将其设置为生成器,只生成
''{},{}.format
结果,而不是构建一个列表。@PatrickHaugh您不能返回不在function@Misha1991谢谢,很乐意帮忙!