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)
相关推荐
数据智能老司机5 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机6 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机6 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机6 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i7 小时前
drf初步梳理
python·django
每日AI新事件7 小时前
python的异步函数
python
这里有鱼汤8 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook17 小时前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室17 小时前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三19 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试