使用readlines后调用json.loads报错及换行符处理疑问
解决UFW日志处理的JSON解析错误
1. 第一个错误:TypeError: the JSON object must be str, bytes or bytearray, not generator
- 原因:
json.loads()仅接受单个字符串/字节对象,你传入的生成器表达式(x.strip("\n") for x in data)类型不匹配。 - 修复逻辑:若要逐行解析,必须循环遍历每行,对每个单独的字符串调用
json.loads();若日志文件是完整JSON数组格式,直接读取整个文件内容再解析即可。
2. 第二个错误:JSONDecodeError: Expecting value: line 1 column 1 (char 0)
- 核心原因:UFW默认生成的日志是syslog格式的纯文本,并非JSON格式,直接用
json.loads()解析必然失败。 - 验证方式:打印一行处理后的内容确认:
输出会是类似这样的非JSON文本:with open('ufw.txt', 'r') as f: first_line = f.readline().strip() print(first_line)Jun 10 12:34:56 myhost ufw[12345]: [UFW BLOCK] IN=eth0 OUT= MAC=aa:bb:cc:dd:ee:ff SRC=192.168.1.100 DST=192.168.1.200 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=54321 DPT=80 WINDOW=65535 RES=0x00 SYN URGP=0
正确处理UFW日志的方法
方法1:手动解析文本字段
通过正则拆分日志中的键值对:
import re def parse_ufw_log(line): # 提取动作类型(如BLOCK/ALLOW) action_match = re.search(r'\[UFW (\w+)\]', line) action = action_match.group(1) if action_match else None # 提取所有键值对(如IN=eth0、SRC=192.168.1.1) kv_pairs = re.findall(r'(\w+)=([^\s]+)', line) log_data = dict(kv_pairs) if action: log_data['action'] = action return log_data # 批量处理日志文件 parsed_logs = [] with open('ufw.txt', 'r') as f: for line in f: stripped_line = line.strip() if not stripped_line: # 跳过空行 continue parsed = parse_ufw_log(stripped_line) parsed_logs.append(parsed) # 查看解析结果 print(parsed_logs[0])
方法2:使用第三方库简化解析
安装ufw-log-parser库后直接调用解析方法:
pip install ufw-log-parser
from ufw_log_parser import parse_log_line parsed_logs = [] with open('ufw.txt', 'r') as f: for line in f: line = line.strip() if line: parsed = parse_log_line(line) parsed_logs.append(parsed)
换行符处理建议
- 用
line.strip()可一次性去除每行首尾的换行符、空格等空白字符; - 若仅需去掉换行符,用
line.rstrip('\n')更精准(不会误删开头的空格)。
内容的提问来源于stack exchange,提问作者MikiBelavista
相关产品推荐
相关产品推荐

