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
相关产品推荐
相关产品推荐

