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

Python文件写入问题求助:修改内容无法写入原文件

问题分析与修复方案

你代码的核心问题出在文件读写模式和指针操作上:
用r+模式打开文件时,当你通过for line in f读取内容,文件指针会逐步移动到文件末尾,此时执行f.write(line)会把修改后的内容追加到原文件的末尾,而非替换原有内容——所以你看起来原文件没变化,其实修改后的内容是加在原内容后面了。而且边读边写的操作很容易导致指针混乱,逻辑上极易出错。

另外,你用re.findall配合replace的方式也有隐患:如果一行里有重复数字(比如"123 123"),第二次replace可能会误改之前替换生成的内容,效率也不高。

下面是两种靠谱的修复方案:

方案一:全量读写(适合小文件)

先把整个文件内容读出来,一次性完成替换,再覆盖写入原文件,逻辑清晰不易出错:

import os
import re

path = "/work/Bible" 
files = os.listdir(path)

for file in files: 
    # 用os.path.join拼接路径,兼容Windows/Linux不同的路径分隔符
    file_path = os.path.join(path, file)
    print(file_path)         
    
    # 读取原文件内容
    with open(file_path, "r", encoding='utf-8') as f:
        content = f.read()
    
    # 用正则一次性替换所有数字,\1代表匹配到的数字本身
    modified_content = re.sub(r'(\d+)', r'\n###### v\1', content)
    
    # 覆盖写入原文件
    with open(file_path, "w", encoding='utf-8') as f:
        f.write(modified_content)

方案二:临时文件逐行处理(适合大文件)

如果文件很大,全量读取会占用过多内存,就用临时文件逐行处理,最后替换原文件,这种方式也更安全(避免处理中出错导致原文件损坏):

import os
import re
import shutil

path = "/work/Bible" 
files = os.listdir(path)

for file in files: 
    file_path = os.path.join(path, file)
    temp_file_path = file_path + ".tmp"
    print(file_path)         
    
    # 读原文件,写临时文件
    with open(file_path, "r", encoding='utf-8') as f_in, open(temp_file_path, "w", encoding='utf-8') as f_out:
        for line in f_in:
            # 逐行替换
            modified_line = re.sub(r'(\d+)', r'\n###### v\1', line)
            f_out.write(modified_line)
    
    # 替换原文件:先删原文件,再把临时文件改名成原文件名
    os.remove(file_path)
    shutil.move(temp_file_path, file_path)

额外提醒

  • 确认/work/Bible下的都是文本文件,别处理二进制文件(比如图片、压缩包)。
  • 如果你的文件编码不是UTF-8,要把encoding='utf-8'改成对应的编码(比如gbk)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:01:15