使用Python从CSV文件匹配JSON日志条目并提取相关信息

使用python从csv文件匹配json日志条目并提取相关信息

本文详细介绍了如何利用Python处理CSV和JSON两种不同格式的数据,实现基于CSV中IP地址和时间戳等关键信息,从JSON日志文件中筛选并提取匹配日志条目的需求。教程涵盖了数据读取、匹配逻辑构建、示例代码及性能优化等关键环节,旨在帮助读者高效地进行异构数据关联与分析。

在日常的数据处理工作中,我们经常会遇到需要从不同格式的数据源中关联信息的需求。例如,有一个包含用户行为或系统事件关键信息的CSV文件,而日志系统则以JSON格式记录了详细的运行日志。此时,我们可能需要根据CSV文件中的特定标识(如IP地址和时间戳)来筛选出JSON日志中对应的条目。本教程将指导您如何使用Python高效地完成这一任务。

1. 理解问题与挑战

我们的目标是:

读取一个CSV文件,其中包含 clientip 和 timestamp 等字段。读取一个JSON日志文件,其中每行是一个JSON对象,包含日志信息。如果JSON日志条目中的某些内容(例如,日志信息中包含的IP地址和日志时间)与CSV文件中的 clientip 和 timestamp 匹配,则将该JSON日志条目提取出来并保存到新文件。

挑战在于:

CSV和JSON的数据结构不一致,字段名称和组织方式可能不同。JSON日志中的IP地址可能不是一个独立的字段,而是嵌入在某个字符串(如 info 字段)中。需要高效地遍历和比较大量数据。

传统的Shell命令(如 join 或 awk)在处理结构化数据时非常强大,但对于这种需要解析复杂JSON结构并在字符串中进行模式匹配的场景,Python提供了更灵活和强大的解决方案。

立即学习“Python免费学习笔记(深入)”;

2. 核心工具:Python的csv和json模块

Python标准库中的 csv 和 json 模块是处理这两种数据格式的利器。

csv 模块:用于读写CSV(逗号分隔值)文件。csv.DictReader 特别方便,它将每一行读取为字典,其中键是CSV文件的标题行。json 模块:用于编码和解码JSON(JavaScript对象表示法)数据。json.loads() 可以将JSON字符串解析为Python对象(如字典或列表),json.dumps() 则可以将Python对象转换为JSON字符串。

3. 数据准备与示例

为了演示,我们先模拟CSV和JSON数据。在实际应用中,您将直接从文件中读取这些数据。

示例 CSV 数据 (data.csv)

"clientip","destip","dest_hostname","timestamp""127.0.0.1","0.0.0.0","randomhost","2023-09-09T04:18:22.542Z""192.168.1.10","0.0.0.0","anotherhost","2023-09-09T05:00:00.000Z"

示例 JSON 日志数据 (logs.json)

[    {"log": "09-Sept-2023", "rate-limit": "somethingelse?", "info": "client @xyz 127.0.0.1", "stream":"stderr", "time": "2023-09-09T04:18:22.542Z"},    {"log": "09-Sept-2023", "rate-limit": "another_event", "info": "client @abc 192.168.1.10", "stream":"stdout", "time": "2023-09-09T05:00:00.000Z"},    {"log": "10-Sept-2023", "rate-limit": "unrelated", "info": "client @def 10.0.0.1", "stream":"stderr", "time": "2023-09-10T06:00:00.000Z"}]

注意:上述JSON数据是经过修正的,以确保其是有效的JSON格式,并且 time 字段被正确地表示为字符串。原始问题中提供的JSON示例可能存在格式问题,在实际处理前需要确保JSON数据的有效性。

4. 实现匹配逻辑

我们将通过以下步骤实现匹配:

读取CSV文件,逐行获取 clientip 和 timestamp。读取JSON日志文件,解析所有日志条目。对于CSV中的每一行,遍历JSON日志条目,检查 timestamp 是否精确匹配,并检查 clientip 是否作为子字符串存在于JSON日志条目的 info 字段中。将所有匹配的JSON日志条目写入一个新的输出文件。

以下是实现此逻辑的Python代码:

import ioimport csvimport jsonimport re # 导入re模块,用于更灵活的字符串匹配,尽管本例中'in'操作符已足够def extract_matched_json_logs(csv_filepath, json_filepath, output_filepath):    """    根据CSV文件中的IP和时间戳,从JSON日志文件中提取匹配的日志条目。    Args:        csv_filepath (str): CSV文件的路径。        json_filepath (str): JSON日志文件的路径。        output_filepath (str): 匹配结果输出文件的路径。    """    matched_entries_count = 0    try:        # 1. 读取CSV数据        # 使用'with'语句确保文件正确关闭        with open(csv_filepath, 'r', encoding='utf-8') as csv_file:            csv_reader = csv.DictReader(csv_file)            csv_data_list = list(csv_reader) # 将CSV数据加载到内存中,方便多次遍历        # 2. 读取JSON日志数据        with open(json_filepath, 'r', encoding='utf-8') as json_file:            json_data = json.load(json_file) # 加载整个JSON文件内容        # 3. 遍历CSV数据并与JSON日志进行匹配        with open(output_filepath, 'w', encoding='utf-8') as outfile:            for csv_row in csv_data_list:                csv_ip = csv_row.get('clientip')                csv_timestamp = csv_row.get('timestamp')                # 确保关键字段存在                if not csv_ip or not csv_timestamp:                    print(f"警告: CSV行缺少'clientip'或'timestamp'字段,跳过: {csv_row}")                    continue                for json_entry in json_data:                    json_time = json_entry.get('time')                    json_info = json_entry.get('info', '') # 使用.get()并提供默认值,防止KeyError                    # 匹配条件:                    # 1. 时间戳精确匹配                    # 2. CSV中的IP地址作为子字符串存在于JSON日志的'info'字段中                    if json_time == csv_timestamp and csv_ip in json_info:                        # 找到匹配,将JSON条目写入输出文件                        outfile.write(json.dumps(json_entry, ensure_ascii=False) + 'n')                        matched_entries_count += 1                        # 如果一个CSV行只应匹配一个JSON条目,可以在这里添加break                        # break        print(f"匹配完成!共找到 {matched_entries_count} 条匹配的JSON日志条目,已保存到 '{output_filepath}'。")    except FileNotFoundError:        print(f"错误: 文件未找到。请检查路径: {csv_filepath} 或 {json_filepath}")    except json.JSONDecodeError:        print(f"错误: JSON文件格式无效。请检查文件: {json_filepath}")    except Exception as e:        print(f"发生未知错误: {e}")# --- 运行示例 ---# 创建模拟文件with open('data.csv', 'w', encoding='utf-8') as f:    f.write('"clientip","destip","dest_hostname","timestamp"n')    f.write('"127.0.0.1","0.0.0.0","randomhost","2023-09-09T04:18:22.542Z"n')    f.write('"192.168.1.10","0.0.0.0","anotherhost","2023-09-09T05:00:00.000Z"')with open('logs.json', 'w', encoding='utf-8') as f:    f.write('''[    {"log": "09-Sept-2023", "rate-limit": "somethingelse?", "info": "client @xyz 127.0.0.1", "stream":"stderr", "time": "2023-09-09T04:18:22.542Z"},    {"log": "09-Sept-2023", "rate-limit": "another_event", "info": "client @abc 192.168.1.10", "stream":"stdout", "time": "2023-09-09T05:00:00.000Z"},    {"log": "10-Sept-2023", "rate-limit": "unrelated", "info": "client @def 10.0.0.1", "stream":"stderr", "time": "2023-09-10T06:00:00.000Z"}]''')# 调用函数进行匹配extract_matched_json_logs('data.csv', 'logs.json', 'matched_json_logs.txt')

5. 代码解析与注意事项

文件读取:csv.DictReader 将CSV文件的每一行转换为字典,方便通过列名访问数据。json.load() 用于读取整个JSON文件并解析为Python对象。如果JSON文件非常大,一行一个JSON对象(JSON Lines格式),则需要逐行读取并使用 json.loads() 解析每行。错误处理:使用 try-except 块来捕获 FileNotFoundError 和 json.JSONDecodeError 等常见错误,提高程序的健壮性。字典的 get() 方法:在访问字典字段时,使用 json_entry.get(‘time’) 而不是 json_entry[‘time’] 是一个好习惯。get() 方法允许您指定一个默认值(例如 ” 或 None),以防止当键不存在时引发 KeyError。IP地址匹配:由于JSON日志中的IP地址可能嵌入在字符串中,我们使用了 csv_ip in json_info 进行子字符串匹配。如果需要更精确的IP地址提取(例如,确保匹配的是完整的IP地址而不是部分数字),可以使用正则表达式 re.search(r’b’ + re.escape(csv_ip) + r’b’, json_info)。输出文件:匹配到的JSON条目被写入 output_filepath 指定的文件。json.dumps(json_entry, ensure_ascii=False) 将Python字典转换回JSON字符串,ensure_ascii=False 确保中文字符不会被转义。n 用于在每个JSON条目后添加换行符,使输出文件易于阅读。性能考虑:对于小型文件,将CSV和JSON数据一次性加载到内存中(如 csv_data_list = list(csv_reader) 和 json_data = json.load(json_file))是可行的。对于非常大的文件,一次性加载可能会导致内存不足。此时,可以考虑使用生成器(generator)逐行读取文件,或者将其中一个文件(通常是较小的那个)加载到内存中,然后流式处理另一个文件。例如,如果JSON日志文件非常大,您可以先将CSV数据构建成一个查找结构(如字典),然后逐行读取JSON日志并进行查找。

6. 总结

通过Python的 csv 和 json 模块,我们可以灵活地处理不同格式的数据,并实现复杂的匹配和提取逻辑。本教程提供了一个通用的框架,您可以根据实际需求调整匹配条件、数据结构和性能优化策略。理解数据格式、选择合适的工具以及编写健壮的代码是成功进行异构数据处理的关键。

以上就是使用Python从CSV文件匹配JSON日志条目并提取相关信息的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1369227.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 09:28:42
下一篇 2025年12月14日 09:28:56

相关推荐

  • 如何解决本地图片在使用 mask JS 库时出现的跨域错误?

    如何跨越localhost使用本地图片? 问题: 在本地使用mask js库时,引入本地图片会报跨域错误。 解决方案: 要解决此问题,需要使用本地服务器启动文件,以http或https协议访问图片,而不是使用file://协议。例如: python -m http.server 8000 然后,可以…

    2025年12月24日
    200
  • 使用 Mask 导入本地图片时,如何解决跨域问题?

    跨域疑难:如何解决 mask 引入本地图片产生的跨域问题? 在使用 mask 导入本地图片时,你可能会遇到令人沮丧的跨域错误。为什么会出现跨域问题呢?让我们深入了解一下: mask 框架假设你以 http(s) 协议加载你的 html 文件,而当使用 file:// 协议打开本地文件时,就会产生跨域…

    2025年12月24日
    200
  • 正则表达式在文本验证中的常见问题有哪些?

    正则表达式助力文本输入验证 在文本输入框的验证中,经常遇到需要限定输入内容的情况。例如,输入框只能输入整数,第一位可以为负号。对于不会使用正则表达式的人来说,这可能是个难题。下面我们将提供三种正则表达式,分别满足不同的验证要求。 1. 可选负号,任意数量数字 如果输入框中允许第一位为负号,后面可输入…

    2025年12月24日
    000
  • 为什么多年的经验让我选择全栈而不是平均栈

    在全栈和平均栈开发方面工作了 6 年多,我可以告诉您,虽然这两种方法都是流行且有效的方法,但它们满足不同的需求,并且有自己的优点和缺点。这两个堆栈都可以帮助您创建 Web 应用程序,但它们的实现方式却截然不同。如果您在两者之间难以选择,我希望我在两者之间的经验能给您一些有用的见解。 在这篇文章中,我…

    2025年12月24日
    000
  • 姜戈顺风

    本教程演示如何在新项目中从头开始配置 django 和 tailwindcss。 django 设置 创建一个名为 .venv 的新虚拟环境。 # windows$ python -m venv .venv$ .venvscriptsactivate.ps1(.venv) $# macos/linu…

    2025年12月24日
    000
  • 花 $o 学习这些编程语言或免费

    → Python → JavaScript → Java → C# → 红宝石 → 斯威夫特 → 科特林 → C++ → PHP → 出发 → R → 打字稿 []https://x.com/e_opore/status/1811567830594388315?t=_j4nncuiy2wfbm7ic…

    2025年12月24日
    000
  • 深入理解CSS框架与JS之间的关系

    深入理解CSS框架与JS之间的关系 在现代web开发中,CSS框架和JavaScript (JS) 是两个常用的工具。CSS框架通过提供一系列样式和布局选项,可以帮助我们快速构建美观的网页。而JS则提供了一套功能强大的脚本语言,可以为网页添加交互和动态效果。本文将深入探讨CSS框架和JS之间的关系,…

    2025年12月24日
    000
  • 项目实践:如何结合CSS和JavaScript打造优秀网页的经验总结

    项目实践:如何结合CSS和JavaScript打造优秀网页的经验总结 随着互联网的快速发展,网页设计已经成为了各行各业都离不开的一项技能。优秀的网页设计可以给用户留下深刻的印象,提升用户体验,增加用户的黏性和转化率。而要做出优秀的网页设计,除了对美学的理解和创意的运用外,还需要掌握一些基本的技能,如…

    2025年12月24日
    200
  • 学完HTML和CSS之后我应该做什么?

    网页开发是一段漫长的旅程,但是掌握了HTML和CSS技能意味着你已经赢得了一半的战斗。这两种语言对于学习网页开发技能来说非常重要和基础。现在不可或缺的是下一个问题,学完HTML和CSS之后我该做什么呢? 对这些问题的答案可以分为2-3个部分,你可以继续练习你的HTML和CSS编码,然后了解在学习完H…

    2025年12月24日
    000
  • 聊聊怎么利用CSS实现波浪进度条效果

    本篇文章给大家分享css 高阶技巧,介绍一下如何使用css实现波浪进度条效果,希望对大家有所帮助! 本文是 CSS Houdini 之 CSS Painting API 系列第三篇。 现代 CSS 之高阶图片渐隐消失术现代 CSS 高阶技巧,像 Canvas 一样自由绘图构建样式! 在上两篇中,我们…

    2025年12月24日 好文分享
    200
  • 巧用距离、角度及光影制作炫酷的 3D 文字特效

    如何利用 css 实现3d立体的数字?下面本篇文章就带大家巧用视觉障眼法,构建不一样的 3d 文字特效,希望对大家有所帮助! 最近群里有这样一个有意思的问题,大家在讨论,使用 CSS 3D 能否实现如下所示的效果: 这里的核心难点在于,如何利用 CSS 实现一个立体的数字?CSS 能做到吗? 不是特…

    2025年12月24日 好文分享
    000
  • CSS高阶技巧:实现图片渐隐消的多种方法

    将专注于实现复杂布局,兼容设备差异,制作酷炫动画,制作复杂交互,提升可访问性及构建奇思妙想效果等方面的内容。 在兼顾基础概述的同时,注重对技巧的挖掘,结合实际进行运用,欢迎大家关注。 正文从这里开始。 在过往,我们想要实现一个图片的渐隐消失。最常见的莫过于整体透明度的变化,像是这样: 立即学习“前端…

    2025年12月24日 好文分享
    000
  • css实现登录按钮炫酷效果(附代码实例)

    今天在网上看到一个炫酷的登录按钮效果;初看时感觉好牛掰;但是一点一点的抛开以后发现,并没有那么难;我会将全部代码贴出来;如果有不对的地方,大家指点一哈。 分析 我们抛开before不谈的话;其实原理和就是通过背景大小以及配合位置达到颜色渐变的效果。 text-transform: uppercase…

    2025年12月24日
    000
  • CSS flex布局属性:align-items和align-content的区别

    在用flex布局时,发现有两个属性功能好像有点类似:align-items和align-content,乍看之下,它们都是用于定义flex容器中元素在交叉轴(主轴为flex-deriction定义的方向,默认为row,那么交叉轴跟主轴垂直即为column,反之它们互调,flex基本的概念如下图所示)…

    2025年12月24日 好文分享
    000
  • 手把手教你用 transition 实现短视频 APP的点赞动画

    怎么使用纯 css 实现有趣的点赞动画?下面本篇文章就带大家了解一下巧妙借助 transition实现点赞动画的方法,希望对大家有所帮助! 在各种短视频界面上,我们经常会看到类似这样的点赞动画: 非常的有意思,有意思的交互会让用户更愿意进行互动。 那么,这么有趣的点赞动画,有没有可能使用纯 CSS …

    2025年12月24日 好文分享
    000
  • 巧用CSS实现各种奇形怪状按钮(附代码)

    本篇文章带大家看看怎么使用 CSS 轻松实现高频出现的各类奇形怪状按钮,希望对大家有所帮助! 怎么样使用 CSS 实现一个内切角按钮呢、怎么样实现一个带箭头的按钮呢? 本文基于一些高频出现在设计稿中的,使用 css 实现稍微有点难度和技巧性的按钮,讲解使用 css 如何尽可能的实现它们。【推荐学习:…

    2025年12月24日 好文分享
    000
  • 原来利用纯CSS也能实现文字轮播与图片轮播!

    怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯css也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助! 今天,分享一个实际业务中能够用得上的动画技巧。【推荐学习:css视频教程】 巧用逐帧动画,配合补间动画实现一个无限循环的轮播效果,像是这样: 立即学习“前端…

    2025年12月24日 好文分享
    000
  • HTML+CSS+JS实现雪花飘扬(代码分享)

    使用html+css+js如何实现下雪特效?下面本篇文章给大家分享一个html+css+js实现雪花飘扬的示例,希望对大家有所帮助。 很多南方的小伙伴可能没怎么见过或者从来没见过下雪,今天我给大家带来一个小Demo,模拟了下雪场景,首先让我们看一下运行效果 可以点击看看在线运行:http://hai…

    2025年12月24日 好文分享
    500
  • 总结整理:需要避坑的五大常见css错误(收藏)

    本篇文章给大家总结5个最常见的css错误,并介绍一下避坑方法,希望对大家有所帮助! 正如我们今天所知,CSS语言是web的一个重要组成部分。它使我们有能力绘制元素在屏幕、网页或其他媒体中的展示方式。 它简单、强大,而且是声明式的。我们可以很容易地实现复杂的事情,如暗黑/光明模式。然而,对它有很多误解…

    2025年12月24日
    000
  • CSS+JS实现爱心点赞按钮(代码示例)

    本篇文章给大家介绍一下css+js实现一个“爱之满满”点赞按钮的方法,希望对大家有所帮助! 前段时间在看一档说唱节目,被里面的一个说唱歌手JBcob的爱之满满这句词给洗脑了。 于是这次给大家带来一个爱之满满的点赞按钮,让大家在点赞的同时还能感受到被爱包裹的感觉。 立即学习“前端免费学习笔记(深入)”…

    2025年12月24日 好文分享
    000

发表回复

登录后才能评论
关注微信