将数据解析为 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']}
我目前正在 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']}