Текстовые данные / строка неправильно анализируются на словарь в Python - PullRequest
0 голосов
/ 10 апреля 2019

Я не могу получить правильное значение из текстового файла в список словаря.Я вызываю необработанный вывод текстового файла, читаю его построчно, убираю пробелы и разбираю в словарь.

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

Product id: sq112
Prodname: ment-bar1
Product id: sq001
Prodname: jumw-cd12
Product id: mcc-hg921
Prodname: emq-vx02
Product id: mmc112
Prodname: ment-bar2
Product id: cx022
Prodname: mxx-21ed
Product id: vcb113
Prodname: emq-vx05
Prodname: trc-vc01
Product id: emx-21ee

Этот сценарий используется для получения идентификатора и имени

file = open("prd1.txt")
data = file.readlines()
dict = {"ProdList":[]}
temp_dict ={}

for line in data:
    line = line.replace('\n', '').strip()
    line = line.split(':')
    line = list(filter(None,line))
    temp_dict["ID"] = line[0]
    temp_dict["Name"] = line[1]
    dict["ProdList"].append(temp_dict)
    temp_dict = {}
print(dict)

Вывод команды dict, сгенерированный как показано ниже

{'ProdList': [{'ID': 'Product id', 'Name': ' sq112'}, {'ID': 'Prodname', 
'Name': ' ment-bar1'}, {'ID': 'Product id', 'Name': ' sq001'}, {'ID': 
'Prodname', 'Name': ' jumw-cd12'}, {'ID': 'Product id', 'Name': ' mcc- 
hg921'}, {'ID': 'Prodname', 'Name': ' emq-vx02'}, {'ID': 'Product id', 
'Name': ' mmc112'}, {'ID': 'Prodname', 'Name': ' ment-bar2'}, {'ID': 
'Product id', 'Name': ' cx022'}, {'ID': 'Prodname', 'Name': ' mxx-21ed'}, 
{'ID': 'Product id', 'Name': ' vcb113'}, {'ID': 'Prodname', 'Name': ' emq- 
vx05'}]}

Ожидаемый вывод следующим образом

{'ProdList':[{'ID':'sq112','Name':' ment-bar1'},{'ID':'sq001','Name':' 
jumw-cd12'},{'ID':'mcc-hg921','Name':' emq-vx02'}]}

Я попробовал, как предложено ниже

for i in range(0,len(data),2):
  line = data[i].split(':')
  nxt_line = data[i+1].split(':')
  if 'id' in data[0]:
    dict['ProdList'].append({'ID':line[1], 'Name': nxt_line[1]})
  else:
    dict['ProdList'].append({'ID':nxt_line[1], 'Name': line[1]})

Я получаю вывод ниже

{'ProdList':[{'ID':' sq112\n','Name':' ment-bar1\n'},{'ID':' 
sq001\n','Name':' jumw-cd12\n'},{'ID':' mcc-hg921\n','Name':' emq-vx02\n'}, 
{'ID':' mmc112\n','Name':' ment-bar2\n'},{'ID':' cx022\n','Name':' mxx- 
21ed\n'},{'ID':' vcb113\n','Name':' emq-vx05\n'},{'ID':' trc- 
vc01\n','Name':' emx-21ee  \n'}]}

Последний идентификатор и название продукта вверх ногами ... это должны быть ID: emx-21ee и Имя: trc-vc01

Ответы [ 2 ]

2 голосов
/ 10 апреля 2019

Попробуйте это для файлов, где идентификатор продукта предшествует названию продукта:

file = open("prd1.txt")
data = file.readlines()
data = [i.strip() for i in data]
dict_ = {"ProdList":[]}
for i in range(0,len(data),2):
    line = data[i].split(':')
    nxt_line = data[i+1].split(':')
    dict_['ProdList'].append({'ID':line[1], 'Name': nxt_line[1]})

ВЫХОД :

{'ProdList': [{'ID': ' sq112', 'Name': ' ment-bar1'}, {'ID': ' sq001', 'Name': ' jumw-cd12'}, {'ID': ' mcc-hg921', 'Name': ' emq-vx02'}, {'ID': ' mmc112', 'Name': ' ment-bar2'}, {'ID': ' cx022', 'Name': ' mxx-21ed'}, {'ID': ' vcb113', 'Name': ' emq-vx05'}]}

Если для некоторых файлов указано имя продуктаперед идентификатором продукта вы должны будете изменить внутри части цикла for, где мы присваиваем значения клавишам 'ID' и 'Name'.Это изменение требует предварительных знаний, содержат ли файлы имя продукта перед идентификатором продукта.Вот код:

for i in range(0,len(data),2):
    line = data[i].split(':')
    nxt_line = data[i+1].split(':')
    dict_['ProdList'].append({'ID':nxt_line[1], 'Name': line[1]})  # Change here

Если вы хотите, чтобы весь процесс был единодушно автоматизирован, т.е. вы не знаете, какие файлы содержат название продукта перед идентификатором продукта, а какой - наоборот, вы должны проверитьсодержит ли первая строка ключевое слово id или name с:

if 'id' in data[0]:
    # proceed with the first loop
else:
    # proceed with the second loop
1 голос
/ 10 апреля 2019

Вы можете соединить каждые две строки, архивируя файл-генератор с собой:

with open('prd1.txt') as file:
    print({'ProdList': [{'ID': id.split(': ')[1].rstrip(), 'Name': name.split(': ')[1].rstrip()} for id, name in zip(data, data)]})

Это выводит:

{'ProdList': [{'ID': 'sq112', 'Name': 'ment-bar1'}, {'ID': 'sq001', 'Name': 'jumw-cd12'}, {'ID': 'mcc-hg921', 'Name': 'emq-vx02'}, {'ID': 'mmc112', 'Name': 'ment-bar2'}, {'ID': 'cx022', 'Name': 'mxx-21ed'}, {'ID': 'vcb113', 'Name': 'emq-vx05'}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...