Как добавить желаемые элементы подсписка разной длины? - PullRequest
1 голос
/ 10 июля 2020

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

file = """./path/to/Inventory2020_1.txt
fileType                           = Inventory
StoreCode
    number:1145C
numId                              = 905895
ValuesOfProducts
    prodsTypeA:150
    prodsTypeB:189
    UpdateTime:2020-03-05 14:45:38
InventoryTime                         = 2020-03-05 14:45:29
userName
    number:123

./path/to/Inventory2020_2.txt   
fileType                           = Inventory
StoreCode
    number:7201B
numId                              = 54272
ValuesOfProducts
    prodsTypeA:75
    prodsTypeB:231
    UpdateTime:2020-03-06 09:12:22
InventoryTime                         = 2020-03-06 09:11:47
userName
    number:3901 
"""

Мой текущий код успешно сохраняет текст во вложенном списке , используя эту строку:

import re

a = [ re.sub(r' += +', ':', line).replace(":", "=", 1).strip().split("=") for line in file.splitlines() ]

Теперь, чтобы сохранить в словаре с параметрами как keys, я использую следующие условия:

d = dict()

for lst in a:
    if len(lst) > 1:
        d.setdefault(lst[0], []).append(lst[1])
    else:
        if "path" in lst[0]:
            d.setdefault("File", []).append(re.sub(r'.+/', '', lst[0]))

>>> d
{
'File': ['Inventory2020_1.txt', 'Inventory2020_2.txt'], 
'fileType': ['Inventory', 'Inventory'], 
'number': ['1145C', '123', '7201B', '3901'], 
'numId': ['905895', '54272'], 
'prodsTypeA': ['150', '75'], 
'prodsTypeB': ['189', '231'], 
'UpdateTime': ['2020-03-05 14:45:38 -05:00', '2020-03-06 09:12:22'], 
'InventoryTime': ['2020-03-05 14:45:29', '2020-03-06 09:11:47']
}
>>>

Как вы Можно видеть, что для некоторых параметров связанное значение отделено знаком = в той же строке, и я могу сохранить пару key, value в том же подсписке напрямую, используя split ("="). Но некоторые ключевые значения, которые меня интересуют, находятся в другой строке, например:

StoreCode
    number:1145C
    

В этом случае меня интересует значение key,pair key=StoreCode и value=1145C

Для этого:

ValuesOfProducts
    prodsTypeA:75
    prodsTypeB:231
    UpdateTime:2020-03-06 09:12:22

Мне нужны пары key,value:

  • key=prodsTypeA и value=75
  • key=prodsTypeB и value=231
  • key=UpdateTime и value=2020-03-06 09:12:22

Итак, окончательный словарь будет иметь такую ​​структуру:

{
'File': ['Inventory2020_1.txt', 'Inventory2020_2.txt'], 
'fileType': ['Inventory', 'Inventory'], 
'StoreCode': ['1145C', '7201B'], 
'numId': ['905895', '54272'], 
'prodsTypeA': ['150', '75'], 
'prodsTypeB': ['189', '231'], 
'UpdateTime': ['2020-03-05 14:45:38', '2020-03-06 09:12:22'], 
'InventoryTime': ['2020-03-05 14:45:29', '2020-03-06 09:11:47']
'userName': ['123', '3901']
}

Основная проблема заключается в том, что в моем текущем выводе параметры StoreCode и userName имеют интересующие меня значения, связанные со словом number. Затем добавляются эти смешанные значения, и на самом деле некоторые значения, связанные с number, принадлежат ключу StoreCode, а другие значения, связанные с number, принадлежат ключу userName.

Может кто-нибудь поможет мне получить мои ожидаемый результат, пожалуйста. Заранее спасибо.

1 Ответ

1 голос
/ 10 июля 2020

Это не совсем то, как вы его указали, но если предположить, что структура остается постоянной во всех отношениях, следующее (или что-то подобное), которое позволяет избежать использования регулярных выражений, вероятно, сработает для вас:

subfiles = file.split('./path/to/')
locs = [0,2,3,5,6,7,8,10]
vals = []
for s in subfiles[1:]:    
    target = s.strip().splitlines()[1:]
    row = [s.split('fileType')[0].strip()]
    for loc in locs:        
        if "=" in target[loc]:
            entry = target[loc].split('=', 1)[1].strip()     
        else:
            if ":" in target[loc]:
                entry = target[loc].split(':',1)[1].strip()
        row.append(entry)
    vals.append(row)

key_names =['File','fileType', 'StoreCodenumber','numId','ValueOfProdsTypeA','ValueOfProdsTypeB','ProdsUpdateTime','InventoryTime','userName']
d = {}
for k, v1, v2 in zip(key_names,vals[0],vals[1]):
    d[k] = [v1,v2]
d

Вывод:

{'File': ['Inventory2020_1.txt', 'Inventory2020_2.txt'],
 'fileType': ['Inventory', 'Inventory'],
 'StoreCodenumber': ['1145C', '7201B'],
 'numId': ['905895', '54272'],
 'ValueOfProdsTypeA': ['150', '75'],
 'ValueOfProdsTypeB': ['189', '231'],
 'ProdsUpdateTime': ['2020-03-05 14:45:38 -05:00', '2020-03-06 09:12:22'],
 'InventoryTime': ['2020-03-05 14:45:29', '2020-03-06 09:11:47'],
 'userName': ['123', '3901']}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...