这个问题是要澄清我在处理文件源中的字符串并将其附加到字典键列表(从另一个SO问题扩展而来)时遇到的问题。这是下面的示例源文件:
Name: David
Age: 23
Name: Ally
Age: 21
Age: 20
Name: John
Name: Peter
Age: 22
如果您注意到文件具有名称,年龄,名称,年龄和突然的年龄,名称并返回名称,年龄...这可能会发生(在名称和年龄之间缠绕)到文件中的任何行。
如果一切都以名字开头,以年龄结尾;然后我可以使用以下代码逐一阅读并将其解析到字典列表中:
file = open("file")
data = file.readlines()
data = [i.strip() for i in data]
dict_ = {"Person":[]}
for i in range(0,len(data),2):
line = data[i].split(':')
nxt_line = data[i+1].split(':')
dict_['Person'].append({'Name':line[1], 'Age': nxt_line[1]})
问题是,当数据文件中的某些名称和年龄行发生扭曲时,例如上面的数据文件,并且在运行代码时,该值被错误地解析。
即使名称和年龄在源文件中的位置颠倒并且不遵循顺序,如何确保名称和年龄的值也可以正确地传递到字典。
请告知。谢谢。
答案 0 :(得分:1)
一种方法是每两行配对。
例如:
NotifyPropertyChanged
输出:
with open(filename) as infile:
data = [i.strip() for i in infile.readlines()]
data = [data[i:i+2] for i in range(0, len(data), 2)] #Divide line to chunks of 2.
result = []
for m, n in data:
val = dict([m.split(":")])
val.update(dict([n.split(":")]))
result.append(val)
print(result)
答案 1 :(得分:1)
尝试一下:
file = open("temp2.txt")
data = file.readlines()
data = [i.strip() for i in data]
dict_ = {"Person":[]}
for i in range(0,len(data),2):
line = data[i].split(':')[1].strip() # Remove the leading spaces of the second split item
nxt_line = data[i+1].split(':')[1].strip() # Remove the leading spaces of the second split item in the next line
if line.isnumeric(): # 'any_int'.isnumeric() returns True
dict_['Person'].append({'Name':nxt_line, 'Age': line})
else: # If the string is not numeric type, it must be the name
dict_['Person'].append({'Name':line, 'Age': nxt_line})
输出:
{'Person': [{'Name': 'David', 'Age': '23'}, {'Name': 'Ally', 'Age': '21'}, {'Name': 'John', 'Age': '20'}, {'Name': 'Peter', 'Age': '22'}]}