Чтение и анализ строки в файле строка за строкой - данные файла источника данных не в последовательности или в шаблоне для добавления данных - PullRequest
0 голосов
/ 11 апреля 2019

Этот вопрос проясняет проблему, возникающую у меня при работе со строкой в ​​источнике файла и добавлении ее в список ключей словаря, расширенный из другого вопроса 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]})

Проблема в том, что некоторые строки имени и возраста скручены в файле данных, как пример файла данных выше, ипри запуске кода это значение неправильно анализируется.

Как обеспечить правильную передачу значения имени и возраста в словарь, даже если позиция имени и возраста в исходном файле перевернута и не следуетпоследовательность.

Пожалуйста, сообщите.Спасибо.

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

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

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 голос
/ 11 апреля 2019

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

Ex:

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'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...