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

