【问题标题】:Parsing data into Parent-Child - Python将数据解析为父子 - Python
【发布时间】:2020-07-28 10:44:41
【问题描述】:

我目前正在使用 Python 进行一个小项目,该项目会产生大量混乱的数据。 数据来自多个来源,每个来源可以返回不同的数据顺序/格式。

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

id 喜欢把它变成这样的东西:(当然还有其他的列表项)

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)

有没有办法从改变列表中位置并且在某些列表中可能不存在的列表项动态创建父项和子项?

--- 从结果 1 中我们没有“哈希”的列表项

--- 从结果 2 我们有 ['hash' : 1234],它可以拉。父 = 哈希 |孩子 = 1234

--- 从结果 3 我们有 ['hash' : 4321],它可以拉。父 = 哈希 |孩子 = 4321

--- 父级 = 哈希 |孩子 = 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'}如果数据是这样进来的,那么实现就容易多了。
  • 我没有查字典,每个String需要单独分析,但它是每个{}之间包含的数据
  • 所以数据是这样的? 'region_code': 'MO', 'postal_code': None, 'country_code': 'US', 'isp': 'ISP-Name'
  • 是的,我一直在阅读,看起来这可能是我的答案。所以三个不同的字符串将是三个不同的字典。然后我可以在所有 3 个字典中搜索 Hash 条目,它会返回类似于 TLDR 中的内容吗?如果是这样,你想把一些东西作为答案,这样我就可以投票并将其标记为已解决:D

标签: python python-3.x list parsing parent-child


【解决方案1】:

如果您的数据总是采用这种格式:

'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]}。那是哪一行的哈希?除非您的数据中有标记表示数据所属的位置,或者您有多个数据集对应于表中它们自己的行,否则这是不可能的。如果您的数据行对应于一行,那么您可以执行以下操作来实现您的 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']}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    相关资源
    最近更新 更多