You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

问题分析与修正

核心问题

  1. 写入文件时,src.write()要求传入字符串,但代码错误传入了整个result列表;且循环变量line是字典,无法直接转成字符串写入。
  2. 读取文件用readlines()后转成字符串,会引入列表的[]和换行符,干扰正则匹配,应该直接读取全部文本。
  3. 重复导入正则模块,只需保留标准的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:40:42