Python保存JSON列表到文件报错:write()参数需为str而非list
问题:保存JSON日志处理结果时出现类型错误
执行代码保存处理后的日志列表时,报错:
write() argument must be str, not list
原代码如下:
import regex as re import re f_name = 'test1.txt' splitter = r'"Event\d+":{(.*?)}' # 匹配大括号内的内容 # 读取文件 with open(f_name, 'r') as src: data = src.readlines() # 提取目标内容 tokens = re.findall(splitter, str(data)) # 处理token生成字典列表 result = [] for token in tokens: line_dict = {} pairs = token.split(',') for pair in pairs: splitter = r'"(.*)"\s*:\s*"(.*)"' # 匹配键值对 parts = re.search(splitter, pair) key, value = parts.group(1), parts.group(2) line_dict[key] = value result.append(line_dict) # 写入文件(错误部分) with open(f_name, 'w') as src: for line in result: src.write(result)
问题分析与修正
核心问题
- 写入文件时,
src.write()要求传入字符串,但代码错误传入了整个result列表;且循环变量line是字典,无法直接转成字符串写入。 - 读取文件用
readlines()后转成字符串,会引入列表的[]和换行符,干扰正则匹配,应该直接读取全部文本。 - 重复导入正则模块,只需保留标准的
import re即可。
修正方案(两种可选)
方案1:写入完整的JSON数组
使用json.dump()直接把列表序列化为标准JSON格式写入文件:
import re import json f_name = 'test1.txt' splitter = r'"Event\d+":{(.*?)}' # 读取全部文本 with open(f_name, 'r') as src: data = src.read() tokens = re.findall(splitter, data) result = [] for token in tokens: line_dict = {} pairs = token.split(',') for pair in pairs: splitter = r'"(.*)"\s*:\s*"(.*)"' parts = re.search(splitter, pair) if parts: # 增加判断避免匹配失败报错 key, value = parts.group(1), parts.group(2) line_dict[key] = value if line_dict: # 非空字典再加入结果 result.append(line_dict) # 写入JSON格式 with open(f_name, 'w') as src: json.dump(result, src, indent=2, ensure_ascii=False)
方案2:逐行写入每个JSON对象
如果需要每行一个JSON对象(JSON Lines格式):
import re import json f_name = 'test1.txt' splitter = r'"Event\d+":{(.*?)}' with open(f_name, 'r') as src: data = src.read() tokens = re.findall(splitter, data) result = [] for token in tokens: line_dict = {} pairs = token.split(',') for pair in pairs: splitter = r'"(.*)"\s*:\s*"(.*)"' parts = re.search(splitter, pair) if parts: key, value = parts.group(1), parts.group(2) line_dict[key] = value if line_dict: result.append(line_dict) # 逐行写入 with open(f_name, 'w') as src: for item in result: json.dump(item, src, ensure_ascii=False) src.write('\n') # 每行结尾加换行
额外说明
- 增加了
if parts:判断,避免某些不匹配的键值对导致代码崩溃。 ensure_ascii=False保证中文等非ASCII字符正常显示。indent=2让JSON格式更易读(仅方案1适用)。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

