[英]How to parse specific block of text file and export json format by Python
I tried to use the following python to parse sample file(sample.txt).我尝试使用以下 python 来解析示例文件(sample.txt)。 But the result is unexpected.但结果出乎意料。
sample:样本:
# Summary Report #######################
System time | 2020-02-27 15:35:32 UTC (local TZ: UTC +0000)
# Instances ##################################################
Port Data Directory Nice OOM Socket
===== ========================== ==== === ======
0 0
# Configuration File #########################################
Config File | /etc/srv.cnf
[mysqld]
server_id = 1
port = 3016
tmpdir = /tmp
performance_schema_instrument = '%=on'
innodb_monitor_enable = 'module_adaptive_hash'
innodb_monitor_enable = 'module_buffer'
[client]
port = 3016
# management library ##################################
jemalloc is not enabled in mysql config for process with id 2425
# The End ####################################################
code.py代码.py
import json
import re
all_lines = open('sample.txt', 'r').readlines()
final_dict = {}
regex = r"^([a-zA-Z]+)(.)+="
config = 0 # not yet found config
for line in all_lines:
if '[mysqld]' in line:
final_dict['mysqld'] = {}
config = 1
continue
if '[client]' in line:
final_dict['client'] = {}
config = 2
continue
if config == 1 and re.search(regex, line):
try:
clean_line = line.strip() # get rid of empty space
k = clean_line.split('=')[0].rstrip() # get the key
v = clean_line.split('=')[1].lstrip()
final_dict['mysqld'][k] = v
except Exception as e:
print(clean_line, e)
if config == 2 and re.search(regex, line):
try:
clean_line = line.strip() # get rid of empty space
k = clean_line.split('=')[0].rstrip() # get the key
v = clean_line.split('=')[1].lstrip()
final_dict['client'][k] = v
except Exception as e:
print(clean_line, e)
print(final_dict)
print(json.dumps(final_dict, indent=4))
with open('my.json', 'w') as f:
json.dump(final_dict, f, sort_keys=True)
The unexpected result:意想不到的结果:
{ "client": { "port": "3016" }, "mysqld": { "performance_schema_instrument": "'%", "server_id": "1", "innodb_monitor_enable": "'module_buffer'", "port": "3016", "tmpdir": "/tmp" } } {“客户端”:{“端口”:“3016”},“mysqld”:{“performance_schema_instrument”:“'%”,“server_id”:“1”,“innodb_monitor_enable”:“'module_buffer'”,“端口” :“3016”,“tmpdir”:“/tmp”}}
The expected result:预期结果:
{
"client": {
"port": "3016"
},
"mysqld": {
"performance_schema_instrument": "'%=on'",
"server_id": "1",
"innodb_monitor_enable": "'module_buffer','module_adaptive_hash'",
"port": "3016",
"tmpdir": "/tmp"
}
}
Is is possible to achieve the above result?是否有可能达到上述结果?
The configparser is used to handle configuration file settings in python. configparser 用于处理 python 中的配置文件设置。
import configparser, re, json
regex_string = '# Configuration File #.*?\n(\[.*?)# management library #'
configuration_string = re.findall(regex_string,open('temp').read(),re.DOTALL)[0]
c = configparser.RawConfigParser(strict=False)
c.read_string(configuration_string)
settings = {k:dict(v) for k,v in c.items() if k!='DEFAULT'}
json.dump(settings,open('temp.json','w'),sort_keys=True,indent=4)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.