这是个广告不要点击哈哈哈

文件替换字符串的一个方法,一般方法是读然后重新写入文件,但是对于大文件来说这种操作不太理想,我们可以按位置修改指定位置的某个字符串,这样避免了全文件的读写,也避免内存的占用,

基本思路是,每一行每一行的读文件并查找特征字符串,然后用file.seek() 方法将读写的位置指定到需要修改处然后写入目标字符串。

  • 用到的知识点,读文件

    读文件的模式有很多种不一一列举,r+表示打开一个文件用于读写。文件指针将会放在文件的开头。

    def readFile(path):
        #R
        with open(path,"r+") as f:
            for line in f:
                print(line)
            f.close()
        print("读文件完成")
    
    path="D:\\tmp\\manim\\file\\1.txt"
    readFile(path)

     

  • 查找字符串位置,str.find(target) 返回起始点位置如果是-1则表示不存在

    "123WWW".find("WWW")
    
  • 文件指针偏移到指定位置

    #文件路径,原字符串,要替换成的目标字符串
    def replaceText(filePath,sourceText,targetText):
        if(len(sourceText)!=len(targetText)):
            raise Exception("原始字符串长度与目标字符串不符,容易覆盖有用信息", sourceText,targetText)
        with open(filePath,'r+') as f:
            line=f.readline()
            index=0
            # 遇到中间空行的可以自行观察并不是空字符串
            while ( line!=""):
                print(line)
                # 本行内字符串所在位置
                windex=line.find(sourceText)
                if(windex!=-1):
                    print("windex={}".format(windex))
                    print("当前位置:{},替换内容起点:{}".format(f.tell(),index+windex))
                    f.seek(index+windex)
                    f.write(targetText)
                    # f.flush()
                    f.seek(index)
                # 返回当前文件指针,应该是新一行的开始位置
                index=f.tell()
                line=f.readline()
            f.close()
        print("文件修改完毕")

     

有兴趣可以用一个大的文本文件测试一下

posted on 2022-09-08 17:41  水流花落  阅读(2324)  评论(0编辑  收藏  举报