简体   繁体   English

使用 python 将 txt 数据(从日志文件)转换为 json?

[英]converting txt data (from log file) into json using python?

I have a log file which has the format as shown below:我有一个日志文件,其格式如下所示:

parsed: {'priority': '14', 'timestamp': '2021-04-13 13:42:07', 'hostname': 'invi-dev-gw2', 'rootname': 'root', 'pid': '27889', 'message': 'Session STARTED - Client[ID:8242, Physical: 111.119.187.47, Virtual: 10.1.0.66] <--> Service[Name:Attendance1, ID:704, Physical: 192.168.3.18, Virtual: 10.1.0.67]'}
parsed: {'priority': '15', 'timestamp': '2021-04-13 13:42:07', 'hostname': 'invi-dev-gw3', 'rootname': 'root', 'pid': '27890', 'message': 'Session STOPPED - Client[ID:8242, Physical: 111.119.187.47, Virtual: 10.1.0.66] <--> Service[Name:Attendance1, ID:704, Physical: 192.168.3.18, Virtual: 10.1.0.67]'}

Basically there are two data's in the text file.文本文件中基本上有两个数据。 The next step is to convert the text data into a JSON using Python. So far I have the python script for the JSON conversion as shown below:下一步是使用 Python 将文本数据转换为 JSON。到目前为止,我有用于 JSON 转换的 python 脚本,如下所示:

# Python program to convert text 
# file to JSON 
import json 


# the file to be converted to 
# json format 
filename = 'output.txt'

# dictionary where the lines from 
# text will be stored 
dict1 = {} 

# creating dictionary 
with open(filename) as fh: 

    for line in fh: 

        # reads each line and trims of extra the spaces 
        # and gives only the valid words 
        command, description = line.strip().split(None, 1) 

        dict1[command] = description.strip() 

# creating json file 
# the JSON file is named as test1 
out_file = open("test.json", "w") 
json.dump(dict1, out_file, indent = 4, sort_keys = False) 
out_file.close() 

Now the JSON file is created but it showed only one data (The output should show 2 data) as shown below:现在创建了 JSON 文件,但它只显示了一个数据(output 应该显示 2 个数据),如下所示:

    "parsed:": "{'priority': '15', 
                 'timestamp': '2021-04-13 13:42:07',
                  'hostname': 'invi-dev-gw3',
                  'rootname': 'root', 
                  'pid': '27890', 
                  'message': 'Session STOPPED - Client[ID:8242, Physical: 111.119.187.47, Virtual: 10.1.0.66] <--> Service[Name:Attendance1, ID:704, Physical: 192.168.3.18, Virtual: 10.1.0.67]'
}"

I don't know why it's not printing the whole data.我不知道为什么它不打印整个数据。 It should show another data in the JSON file but showed only one.它应该显示 JSON 文件中的另一个数据,但只显示了一个。 Can anyone help me with this?谁能帮我这个?

Where you have dict1[command] = description.strip() you really want something more like: dict1[command].append(description.strip()) (so dict1 really wants to be a list).你有dict1[command] = description.strip()你真的想要更像的东西: dict1[command].append(description.strip()) (所以dict1真的想成为一个列表)。 There is one additional wrinkle in that you likely wanted to use json.loads() but your input data uses single quotes so let's parse it with ast还有一个问题是您可能想使用json.loads()但您的输入数据使用单引号所以让我们用ast解析它

I would try something like:我会尝试类似的东西:

import ast
import collections
import json

data_in = [
    "parsed: {'priority': '14', 'timestamp': '2021-04-13 13:42:07', 'hostname': 'invi-dev-gw2', 'rootname': 'root', 'pid': '27889', 'message': 'Session STARTED - Client[ID:8242, Physical: 111.119.187.47, Virtual: 10.1.0.66] <--> Service[Name:Attendance1, ID:704, Physical: 192.168.3.18, Virtual: 10.1.0.67]'}",
    "parsed: {'priority': '15', 'timestamp': '2021-04-13 13:42:07', 'hostname': 'invi-dev-gw3', 'rootname': 'root', 'pid': '27890', 'message': 'Session STOPPED - Client[ID:8242, Physical: 111.119.187.47, Virtual: 10.1.0.66] <--> Service[Name:Attendance1, ID:704, Physical: 192.168.3.18, Virtual: 10.1.0.67]'}"
]

data_out = collections.defaultdict(list)
for row in data_in:
    command, command_text = [value.strip() for value in row.split(":", 1)]
    data_out[command].append(ast.literal_eval(command_text))

print(json.dumps(data_out, indent=2))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM