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

TypeError:write()参数需为str而非list 如何将列表按格式写入txt

报错根因

TypeError: write() argument must be str, not list 触发的直接原因是文件对象的write()方法仅接受字符串类型入参:

  • 直接传入houses嵌套列表时,参数类型不匹配直接抛出类型错误
  • 用str(houses)强转列表时,写入的是Python列表的原生表示格式(类似[['StTeresa', 0], ['StKolbe', 0]]),完全不符合原文件「每行存储学院名+空格+分数」的格式要求。

另外原代码的文件操作还有隐藏问题:调用readlines()读完文件后,文件指针停在文件末尾,直接调用truncate(0)虽然能清空内容,但后续写入如果不重置指针位置,容易出现空字符填充、内容错位的异常。

修正方案

最小改动版本

保留原有全局文件句柄的写法,修正save()函数的写入逻辑即可:

def save():
  # 将文件指针重置到文件起始位置,避免写入错位
  f.seek(0)
  # 清空文件原有内容
  f.truncate(0)
  # 遍历所有学院得分数据,逐行按要求格式拼接写入
  for house in houses:
    # 拼接为「学院名 分数」格式,末尾加换行符,整数分数自动转为字符串
    f.write(f"{house[0]} {house[1]}\n")
  # 刷新缓冲区,关闭文件
  f.close()

更稳妥的最佳实践写法

不建议长期持有打开的文件句柄,使用with上下文管理器可以自动处理文件打开、关闭、缓冲区刷新逻辑,从根源上避免文件损坏、资源泄漏问题。用写入模式w打开文件时,Python会自动清空文件原有内容,不需要手动调用截断方法,逻辑更简洁:

houses = []
# 读取文件数据
with open("houses.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()

for line in lines:
    info = line.strip().split()
    # 分数转整数存储,方便后续做加分、减分运算
    info[1] = int(info[1])
    houses.append(info)

print(houses)

# 保存数据函数
def save():
    # w模式打开会自动清空原文件内容
    with open("houses.txt", "w", encoding="utf-8") as f:
        for house in houses:
            f.write(f"{house[0]} {house[1]}\n")
关键注意点
  • 写入文件时,所有传入write()的内容必须是字符串类型,整数、列表等类型需要手动做格式转换
  • 每行内容末尾需要加\n换行符,否则所有内容会拼接在同一行,不符合原文件格式
  • 对文件内容做更新写入时,优先用w模式打开,比手动操作指针、调用truncate()的出错概率低很多

内容的提问来源于stack exchange,提问作者Callum Shaw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:51:20