Python:正则表达式与Json -- WhiteNight's Site
标签:python
将正则表达式应用到json文件中
来看看如何将正则表达式应用到json文件的处理中。
前情提要
识别时间戳
以自动化流程为例,比如屏幕上有一个时间戳,我需要先对当前屏幕截图,再通过RapidOCR-Json得到这张截图的OCR数据。最后再将json文件中有关时间戳的数据写入到excel表格中。
前两步很简单,无非就是cmd调用和重定向。但是后者就比较麻烦。这里给出两条json数据作为例子
...
{
"data":[
"score": 0.9616522789001465,
"text": "192.168.0.1: 2024-01-26 15:51:31.420"
},
{
"score": 0.8731944213310877,
"text": "192.168.0.2: 2024-01-26 15:51:31.420"
},
...
]
}
text里面是条时间戳。格式为"IP地址: %y-%m-%d %h:%m:%s.%f"(%f表示毫秒)。那么现在我想把时间戳提取处理,写入到excel表格中,预期的excel结果如下:
|-------------------------|-------------------------|
| 192.168.0.1 | 192.168.0.2 |
| 2024-01-26 15:51:31.420 | 2024-01-26 15:51:31.420 |
预期EXCEL
思路的话倒不是没有。先转成dict,IP作为Key,通过not in来判断字典中有没有这个IP,没有的话就新加上去。再把对应的时间戳加上就行。
转excel的话我估计得用到pandas,最重要的是得做一步行转列的操作,再写入到excel里面。
思路有了,接下来来看看具体代码实现。
模式与数据结构
正则表达式与DataFrame
那首先得看看子任务:json怎么转为dict?
首先是读取,直接json.load完事。接下来是确定"模式"(pattern)。对于我们的时间戳而言,它的模式是
xxx . xxx . xxx . xxx xxx:xxx:xxx.xxx
叫它"模式"也好,"模板"也好,简单来说,哪个字符串能对的上这个模板,那么match的结果就返回true。不过模式都是人为规定的,json格式也是人为规定的。所以也没必要真的按每个标点符号去匹配。
我们的时间戳可以分为前后两个部分。只要前面是IP,IP后面跟着的字符串里面有冒号和点号,点号后面一定接着一串数字,那就可以认为这就是我们要找的时间戳。
pattern = re.compile(r'(\d+\.\d+\.\d+\.\d+):\s*(.+)')
接下来再把IP和时间点分别写入到dict中,+-直接append就行。
import json
...
...
...
def json_to_excel(json_file_path,ip_dict):
# 读取JSON文件
with open(json_file_path, 'r', encoding='UTF-8') as f:
json_data = json.load(f)
# 正则表达式匹配IP地址和时间戳
pattern = re.compile(r'(\d+\.\d+\.\d+\.\d+):\s*(.+)')
# 遍历JSON数据中的 "data" 部分
for item in json_data.get("data", []):
text = item.get("text", "")
match = pattern.match(text)
if match:
ip = match.group(1)
timestamp = match.group(2)
if ip not in ip_dict:
ip_dict[ip] = []
ip_dict[ip].append(timestamp)
到这里还没结束。我们得把字典的数据写入到pandas的数据结构DataFrame中,DataFrame可以简单理解为一张数据表格。
df = pd.DataFrame()
# 遍历字典,将IP地址作为列名,时间戳作为数据填充到DataFrame中
for ip_local, timestamps in ip_dict.items():
df[ip_local] = timestamps
json转excel
DataFrame.to_excel
别人都封装好了,直接写入就行。接下来看看这题的"变种"------假设需求又增加了。
假设我还要新建一列,用来记录同一IP之间每一时间点的差值。至于怎么计算差值,这个看自己情况。可以自己写个字符串转数字作差值的,也可以调to_datatime转数据格式再作差值。
def write_to_excel(excel_path):
# 读取Excel文件到DataFrame
df = pd.read_excel(excel_path)
for column in df.columns:
# 将时间字符串转换为datetime对象
time_data = pd.to_datetime(df[column], format='%Y-%m-%d %H:%M:%S.%f')
# 计算时间差值,并将结果转换为秒
time_diff = time_data.diff().dt.total_seconds()
# 将第一行的时间差值设置为0
time_diff.iloc[0] = 0
# 添加新列到DataFrame中,用于存储时间差值
df[column + '-时间差值'] = time_diff
# 保存修改后的DataFrame回Excel文件
df.to_excel(excel_path, index=False)