使用Python读写文本文件时文件内容丢失的原因排查
为什么执行这段Python代码后目标文件内容会丢失?
这事儿的核心原因其实很直接:你用"w"(写入)模式打开文件的那一刻,系统就已经把这个文件的原有内容彻底清空了,不管你之后有没有往里面写东西。
咱们来拆解下你的代码里的问题:
- 你同时打开了同一个文件:一个用
"r"模式读,另一个用"w"模式写。当exportFile = open(..., "w")这行代码执行时,操作系统会立即清空6.txt的所有内容。这时候inputFile虽然是读模式,但文件已经是空的了,后续循环自然读不到任何原内容,最后写入的也只能是空(或者错误处理后的无效内容),看起来就像是原内容凭空消失了。 - 另外你的代码里还有几个语法错误,比如
list(line, sep='\t')是错的,应该用line.split('\t')来分割制表符;而且分割出来的s里的元素都是字符串,你直接做s[1] < 0或者s[0] *= 0.01会报错,得先转成数值类型处理,之后再转回字符串才能拼接写入。
怎么修正这个问题?
最稳妥的方式是先把文件内容全部读入内存,关闭文件后再打开写入模式处理,比如:
# 先读入内容 with open('/content/gdrive/My Drive/dihedral/6.txt', "r") as inputFile: lines = inputFile.readlines() # 处理内容 processed_lines = [] for line in lines: # 正确分割制表符,同时去除换行符避免干扰 s = line.strip().split('\t') try: # 转成数值类型处理逻辑 val1 = float(s[1]) if val1 < 0: val1 += 360 val0 = float(s[0]) * 0.01 # 转回字符串并重新拼接成行 new_line = '\t'.join([str(val0), str(val1)]) + '\n' processed_lines.append(new_line) except (IndexError, ValueError): # 遇到格式错误的行,直接保留原内容避免丢失 processed_lines.append(line) # 写入处理后的内容 with open('/content/gdrive/My Drive/dihedral/6.txt', "w") as exportFile: exportFile.writelines(processed_lines)
用with语句还能自动帮你关闭文件,避免手动关闭遗漏的问题。
另外,也可以先写到一个临时文件里,确认处理没问题后再替换原文件,这样更安全,能避免处理过程中出错导致原文件损坏。
内容的提问来源于stack exchange,提问作者Joe




