将数据解析为 Parent-Child - Python

Parsing data into Parent-Child - Python

我目前正在 Python 做一个小项目,它会产生大量混乱的数据。 数据来自多个来源,每个来源 可以 return 不同的数据 order/format.

TLDR 在底部

我已将此数据解析为每行结果的列表。 但是,如前所述,数据的顺序不同。

因此,拉取列表项 3 可能是每行的不同位数据。此外,我不知道列表项将被称为多少或什么。

这是我的列表(以逗号分隔):

{'region_code': 'MO', 'postal_code': None, 'country_code': 'US', 'isp': 'ISP-Name'}
{'hash': 1234, 'org': 'CompanyName', 'transport': 'tcp', 'data': 'HTTP/1.0 302 Found\r\nLocation'}
{'hash': 4321, 'isp': 'ISP-Name', 'transport': 'tcp', 'data': 'HTTP/1.1 500 Internal Server'}

我想把它变成这样的东西:(当然还有其余的列表项)

Line    -  region_code  -  hash   -  org
1       -  MO           -  N/A    -  N/A
2       -  N/A          -  123456 -  CompanyName
3       -  N/A          -  654321 -  N/A

我目前有这个用逗号将每行内容分成一个列表项

file = open ("filename.txt" , "r")
fileRead = file.readlines()
fileSplit = fileRead.split(",")
file.close()
print (fileSplit[-1])

然后我想按照以下方式做一些事情:

for x in fileSplit:
    splitItem = fileSplit.split(":")
    #some line to make each string before the : a "parent" and after a "Child"

所以这是我的问题:(TLDR)

有没有办法从列表项中动态创建 parents 和 children,这些列表项在列表中的位置会发生变化,并且在某些列表中可能不存在?

--- 从结果 1 我们没有 'hash'

的列表项

--- 从结果 2 我们有 ['hash' : 1234],它能拉动吗? Parent = 散列 | Child = 1234

--- 从结果 3 我们有 ['hash' : 4321],它能拉动吗? Parent = 散列 | Child = 4321

--- Parent = 散列 | Child = 1234, 4321

如果您的数据始终采用这种格式:

'region_code': 'MO', 'postal_code': None, 'country_code': 'US', 'isp': 'ISP-Name'
'hash': 1234, 'org': 'CompanyName', 'transport': 'tcp', 'data': 'HTTP/1.0 302 Found\r\nLocation'
'hash': 4321, 'isp': 'ISP-Name', 'transport': 'tcp', 'data': 'HTTP/1.1 500 Internal Server'

那么这是一种绕过自己将其解析为漂亮对象的 hacky 方法。

import ast

lines = []
file = open ("filename.txt" , "r")

for line in file.readlines():
    lines.append(ast.literal_eval("{"+line+"}"))
file.close()


for line in lines:
    for key,value in line.items():
        print(key)
        print (value)

键是“父”,值是“子”。唯一的问题是我不确定您将如何填充:

Line    -  region_code  -  hash   -  org
1       -  MO           -  N/A    -  N/A
2       -  N/A          -  123456 -  CompanyName
3       -  N/A          -  654321 -  N/A

您的数据没有密钥,因此无法确定哪个字典的哈希值对应于任何行。所以如果:

'hash': 1234, 'org': 'CompanyName', 'transport': 'tcp', 'data': 'HTTP/1.0 302 Found\r\nLocation'
'hash': 4321, 'isp': 'ISP-Name', 'transport': 'tcp', 'data': 'HTTP/1.1 500 Internal Server'

结果为 {'hash': [1234, 4321]}。那是哪一行的哈希值?除非您的数据中有标记表示数据所属的位置,或者您有多个数据集对应于 table 中它们自己的行,否则这是不可能的。如果你的数据行对应一行那么你可以做这样的事情来实现你的 TLDR:

import ast

lines = []
file = open ("filename.txt" , "r")

for line in file.readlines():
    lines.append(ast.literal_eval("{"+line+"}"))
file.close()

merged_dict = {}
for line_dict in lines:
    for key,value in line_dict.items():
        if key in parsed_dict:
            parsed_dict[key].append(value)
        else:
            parsed_dict[key] = [value]

print (merged_dict)

输出:

{'region_code': ['MO'], 'postal_code': [None], 'country_code': ['US'], 'isp': ['ISP-Name', 'ISP-Name'], 'hash': [1234, 4321], 'org': ['CompanyName'], 'transport': ['tcp', 'tcp'], 'data': ['HTTP/1.0 302 Found\r\nLocation', 'HTTP/1.1 500 Internal Server']}