我有一个包含这种格式的行的文件.
@H_404_6@Example 1: nextline = "DD:MM:YYYY INFO - 'WeeklyMedal: Hole = 1; Par = 4; Index = 2; Distance = 459; score = { Player1 = 4 };" Example 2: nextline = "DD:MM:YYYY INFO - 'WeeklyMedal: Hole = 1; Par = 4; Index = 2; Distance = 459; score = { Player1 = 4; Player2 = 6; Player3 = 4 };"
我首先用’:’分割这一行,这给了我一个包含2个条目的列表.@H_403_10@我想将这一行拆分为带有键和值的字典,但是得分键有多个具有值的子键.
@H_404_6@Hole 1 Par 4 Index 2 Distance 459 score Player1 4 Player2 6 Player3 4
所以我使用的是这样的……
@H_404_6@split_line_by_semicolon = nextline.split(":") dictionary_of_line = dict((k.strip(),v.strip()) for k,v in (item.split('=') for item in split_line_by_semicolon.split(';'))) for keys,values in dictionary_of_line.items(): print("{0} {1}".format(keys,values))
但是我在该行的得分元素上收到错误:
@H_404_6@ValueError: too many values to unpack (expected 2)
我可以将’=’上的分割调整为此值,因此它会在第一个’=’后停止
@H_404_6@dictionary_of_line = dict((k.strip(),v in (item.split('=',1) for item in split_line_by_semicolon.split(';'))) for keys,values))
但是我丢失了大括号内的子值.有谁知道如何实现这个多层字典?
最佳答案
一种更简单的方法(但我不知道在你的情况下是否可以接受)将是:
@H_404_6@import re nextline = "DD:MM:YYYY INFO - 'WeeklyMedal: Hole = 1; Par = 4; Index = 2; Distance = 459; score = { Player1 = 4; Player2 = 6; Player3 = 4 };" # compiles the regular expression to get the info you want my_regex = re.compile(r'\w+ \= \w+') # builds the structure of the dict you expect to get final_dict = {'Hole':0,'Par':0,'Index':0,'Distance':0,'score':{}} # uses the compiled regular expression to filter out the info you want from the string filtered_items = my_regex.findall(nextline) for item in filtered_items: # for each filtered item (string in the form key = value) # splits out the 'key' and handles it to fill your final dictionary key = item.split(' = ')[0] if key.startswith('Player'): final_dict['score'][key] = int(item.split(' = ')[1]) else: final_dict[key] = int(item.split(' = ')[1])