Этот вопрос должен прояснить проблему, с которой я сталкиваюсь при работе со строкой в источнике файла и добавлении ее в список ключей словаря, расширенный из другого вопроса 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
chenoi 11 Апр 2019 в 12:06

2 ответа

Лучший ответ

Попробуй это :

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'}]}
1
Arkistarvh Kltzuonstev 11 Апр 2019 в 09:26

Один подход состоит в том, чтобы соединить каждые две линии.

Пример:

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)

Вывод:

[{'Age': ' 23', 'Name': ' David'},
 {'Age': ' 21', 'Name': ' Ally'},
 {'Age': ' 20', 'Name': ' John'},
 {'Age': ' 22', 'Name': ' Peter'}]
1
Rakesh 11 Апр 2019 в 09:26