当前位置: 首页 > news >正文

利用Python轻松实现找出同步日志中的重复数据

在做接口对接时,对方提交过来的数据存在重复数据,这时候可以通过 Python 轻松提取出来

syncDevice_2026-01-07.log

2026-01-07 11:41:33 | [{"deviceMac":"ED:0C:51:C2:B2:EA","deviceSn":"240103 P50162"},{"deviceMac":"C0:7A:A1:6C:67:AA","deviceSn":"221130P50012"},{"deviceMac":"D0:D0:02:39:83:D4","deviceSn":"221130P50012"}]
2026-01-07 11:41:33 | [{"deviceMac":"D0:D0:02:39:83:D4","deviceSn":"221130P50012"},{"deviceMac":"DC:8E:33:BA:3D:6D","deviceSn":"221130P50013"}]

Python 代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

importjson

importre

fromcollectionsimportdefaultdict

deffind_duplicate_devices_unique_mac(log_file_path):

# 按 deviceSn 分组,每组内用集合去重 deviceMac

devices_by_sn=defaultdict(list)

mac_seen_by_sn=defaultdict(set)# 用于跟踪每个 SN 下已见过的 deviceMac

# 读取日志文件

withopen(log_file_path,'r', encoding='utf-8') asfile:

forline_num, lineinenumerate(file,1):

# 使用正则表达式提取 JSON 部分

match=re.search(r'\[.*\]', line)

ifmatch:

try:

# 解析 JSON 数组

devices=json.loads(match.group())

# 将每个设备添加到对应 deviceSn 的分组中,并去重 deviceMac

fordeviceindevices:

device_sn=device.get('deviceSn')

device_mac=device.get('deviceMac')

ifdevice_snanddevice_mac:

# 如果这个 SN 下还没见过这个 MAC,则添加

ifdevice_macnotinmac_seen_by_sn[device_sn]:

devices_by_sn[device_sn].append(device)

mac_seen_by_sn[device_sn].add(device_mac)

exceptjson.JSONDecodeError as e:

print(f"第 {line_num} 行解析 JSON 时出错: {e}")

continue

# 找出重复的 deviceSn(去重 MAC 后仍然有多个记录的)

duplicate_devices={}

fordevice_sn, devicesindevices_by_sn.items():

iflen(devices) >1:

duplicate_devices[device_sn]=devices

returnduplicate_devices

defprint_duplicate_devices(duplicate_devices):

ifnotduplicate_devices:

print("没有找到重复的 deviceSn")

return

print("找到以下重复的 deviceSn (已对 deviceMac 去重):\n")

fordevice_sn, devicesinduplicate_devices.items():

print(f"deviceSn: {device_sn} (去重后出现 {len(devices)} 次)")

print("-"*50)

fori, deviceinenumerate(devices,1):

print(f"第 {i} 条记录:")

# 美化输出 JSON

print(json.dumps(device, indent=2, ensure_ascii=False))

print()

print("="*80)

# 版本2:更简洁的实现,直接输出去重结果

deffind_and_print_duplicates_unique(log_file):

# 存储去重后的设备

unique_devices_by_sn=defaultdict(list)

seen_mac_by_sn=defaultdict(set)

withopen(log_file,'r') as f:

forlineinf:

# 提取 JSON 数组部分

json_match=re.search(r'\[.*\]', line)

ifjson_match:

try:

devices=json.loads(json_match.group())

fordeviceindevices:

sn=device.get('deviceSn')

mac=device.get('deviceMac')

ifsnandmac:

# 如果这个 MAC 还没在这个 SN 组中出现过

ifmacnotinseen_mac_by_sn[sn]:

unique_devices_by_sn[sn].append(device)

seen_mac_by_sn[sn].add(mac)

except:

continue

# 找出并打印重复项

print("重复的设备SN及其数据 (已对deviceMac去重):")

print("="*80)

found_duplicates=False

forsn, devicesinunique_devices_by_sn.items():

iflen(devices) >1:

found_duplicates=True

print(f"\n设备SN: {sn} (去重后出现 {len(devices)} 次)")

print("-"*50)

fori, deviceinenumerate(devices,1):

print(f"记录 {i}:")

# 格式化时间戳

if'productionDate'indevice:

importdatetime

timestamp=device['productionDate']/1000

dt=datetime.datetime.fromtimestamp(timestamp)

device['productionDate_formatted']=dt.strftime('%Y-%m-%d %H:%M:%S')

print(json.dumps(device, indent=2, ensure_ascii=False))

print()

ifnotfound_duplicates:

print("没有找到重复的 deviceSn (或所有重复都是相同的 deviceMac)")

# 主程序

if__name__=="__main__":

log_file_path="syncDevice_2026-01-07.log"

try:

print("="*80)

print("方法1:详细版")

print("="*80)

# 查找重复设备(去重 MAC)

duplicate_devices=find_duplicate_devices_unique_mac(log_file_path)

# 打印结果

print_duplicate_devices(duplicate_devices)

# 统计信息

print("\n统计信息:")

print(f"总共有 {len(duplicate_devices)} 个重复的 deviceSn")

fordevice_sn, devicesinduplicate_devices.items():

print(f" - {device_sn}: {len(devices)} 条不重复的记录")

print("\n"+"="*80)

print("方法2:简洁版")

print("="*80)

find_and_print_duplicates_unique(log_file_path)

exceptFileNotFoundError:

print(f"错误: 找不到文件 {log_file_path}")

exceptException as e:

print(f"处理文件时出错: {e}")

输入结果:

================================================================================
方法1:详细版
================================================================================
找到以下重复的 deviceSn (已对 deviceMac 去重):

deviceSn: 221130P50012 (去重后出现 2 次)
--------------------------------------------------
第 1 条记录:
{
"deviceMac": "C0:7A:A1:6C:67:AA",
"deviceSn": "221130P50012"
}

第 2 条记录:
{
"deviceMac": "D0:D0:02:39:83:D4",
"deviceSn": "221130P50012"
}

================================================================================

统计信息:
总共有 1 个重复的 deviceSn
- 221130P50012: 2 条不重复的记录

================================================================================
方法2:简洁版
================================================================================
重复的设备SN及其数据 (已对deviceMac去重):
================================================================================

设备SN: 221130P50012 (去重后出现 2 次)
--------------------------------------------------
记录 1:
{
"deviceMac": "C0:7A:A1:6C:67:AA",
"deviceSn": "221130P50012"
}

记录 2:
{
"deviceMac": "D0:D0:02:39:83:D4",
"deviceSn": "221130P50012"
}


Process finished with exit code 0

到此这篇关于利用Python轻松实现找出同步日志中的重复数据的文章就介绍到这了

http://www.jsqmd.com/news/789316/

相关文章:

  • Horos医疗影像查看器终极指南:macOS平台的专业级开源解决方案
  • Eclipse CDT开发C/C++项目,头文件报红Unresolved inclusion?手把手教你配置GCC/MinGW路径(附常见环境变量问题排查)
  • 别再只盯着XGBoost了!LightGBM实战:用Adult数据集5分钟搞定收入预测模型
  • 天赐范式第37天:数值模拟到底算不算物理?为什么不问到底算不算数学呢?文心如是说~
  • 2026年外贸GEO排名哪个好 - 品牌企业推荐师(官方)
  • Windows Cleaner终极指南:5步彻底解决C盘爆红问题,让你的电脑重获新生!
  • 如何快速解决Windows苹果设备连接难题:一键安装USB和网络共享驱动终极指南
  • Draw.io Mermaid插件:用代码思维重塑技术图表设计流程
  • 【限时解禁】2026 AI大会餐饮数据看板原始日志(含每分钟人流热力、菜品剩余熵值、AI侍应响应延迟P99)
  • 抖音无水印下载器:三步实现高效自动化视频采集方案
  • PaperBanana:基于多智能体流水线的学术图表自动化生成工具实战
  • 专业的2026年白银宋式美学家具店哪家专业 - 品牌企业推荐师(官方)
  • 放弃编码器!纯靠MPU6050和PID算法,我的TT马达平衡小车也能稳如老狗
  • AI时代人与工具关系再探讨:开拍App等低门槛工具如何服务普通人创作?
  • Vibe Coding:产品经理与设计师的AI编程实战指南
  • Windows Cleaner:解决C盘空间不足问题的开源系统优化工具
  • 九大网盘直链下载终极解决方案:告别限速困扰的技术革新
  • CLion配置NDK开发环境踩坑实录:从MinGW下载到CMake参数详解(Android arm64-v8a)
  • 私有化内网IM部署费用为何难以标准化?三类成本结构决定预算上限 - 小天互连即时通讯
  • MouseClick:解放双手的开源鼠标自动化神器
  • LLM API错误率飙升237%?SITS大会披露的3层可观测性架构,已落地金融级生产环境
  • TrollInstallerX:3分钟搞定iOS应用自由安装的终极指南
  • STM32CubeMX实战:SD卡+DMA+FatFs实现高效文件存储与读写
  • 终极网盘下载助手:LinkSwift - 一键获取九大网盘真实下载地址
  • 解锁AMD Ryzen隐藏性能:5分钟学会使用免费调试神器SMUDebugTool
  • 2026年口碑好的福州军事夏令营企业排名个人经验只供参考 - 品牌企业推荐师(官方)
  • 用AI一键生成Obsidian闪卡:基于大语言模型的间隔重复学习实践
  • LibreDWG:开源CAD文件处理的技术突围与实践指南
  • HDLbits刷题笔记:如何用一道题(shiftcount)吃透Verilog中的多路选择与状态控制
  • 用Python实战SCAN算法:15分钟搞定社交网络中的“关键人物”与“边缘人”识别