Python:正则表达式与Json

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)

你可能感兴趣的:(python,python,正则表达式,json)