如何附加所需的不同长度的子列表元素?

How to append desired different length sublist elements?

我有一个如下所示的文本,我想将其存储在字典中,将相同参数(键)的值存储在子列表中。

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=StoreCodevalue=1145C

对于这个:

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

我感兴趣的 key,value 对是:

因此,最终的字典将具有以下结构:

{
'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']
}

主要问题是,在我当前的输出中,参数 StoreCodeuserName 具有我感兴趣的与词 number 相关的值。然后, 正在附加这些混合值,实际上一些与 number 相关的值属于键 StoreCode 和其他与 number 相关的值 属于键 userName.

请有人帮助我获得预期的输出。提前致谢。

这与您指定的方式不完全相同,但假设结构在所有方面都保持不变,则避免使用正则表达式的以下内容(或类似内容)可能对您有用:

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']}

显然,您可以根据自己的实际需要对其进行修改。