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

Python修改TSV列内容后覆盖原文件仅存最后一行,错误原因是什么?

代码错误原因与修复方案

核心错误点

  • 你在循环内部每次处理一行时都调用mf.seek(0)将文件指针移到文件起始位置,写入当前行后立刻执行mf.truncate()截断文件,这会导致上一次写入的内容直接被当前行覆盖,循环执行到最后自然只保留最后一行的内容。
  • 读取行时使用rstrip()去除了行尾的换行符,写入时没有补充换行符,就算没有覆盖问题,最终所有行也会拼接为一整行。
  • with上下文管理器会在代码块执行结束后自动关闭文件,末尾额外写的mf.close()属于冗余代码。
  • 现有代码的replace(in_char, out_char, 1)逻辑是替换整行第一个匹配的字符,如果你需要严格限定仅替换第一列的所有指定字符,该逻辑还可能误替换后续列中出现的相同字符。

正确实现代码

对于大小适中的TSV文件,最稳妥的实现方式是先读取全部内容完成处理后,再一次性写回原文件:

in_char = "|"
out_char = "_"
my_file = "替换为你的TSV文件路径"

# 读取全量内容并按规则处理
with open(my_file, "r", encoding="utf-8") as f:
    lines = f.readlines()

processed_lines = []
for line in lines:
    # 拆分出第一列替换后再拼接,严格限定仅修改第一列
    parts = line.split("\t", maxsplit=1)
    parts[0] = parts[0].replace(in_char, out_char)
    processed_lines.append("\t".join(parts))

# 覆盖写入原文件
with open(my_file, "w", encoding="utf-8") as f:
    f.writelines(processed_lines)

如果要使用r+模式实现,也要先完成所有行的处理再统一写入:

with open(my_file, "r+", encoding="utf-8") as mf:
    lines = mf.readlines()
    processed = []
    for line in lines:
        parts = line.split("\t", maxsplit=1)
        parts[0] = parts[0].replace(in_char, out_char)
        processed.append("\t".join(parts))
    mf.seek(0)
    mf.writelines(processed)
    # 截断尾部残留的旧文件内容,避免原文件更长时出现冗余内容
    mf.truncate()

内容的提问来源于stack exchange,提问作者Iacopo Passeri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:15:05