文件读写():内容替换

内容替换首先想一下方式,替换后的内容存在哪里?

1、存源文件中    2、存新文件中

源文件好说,一定存在,新文件呢,不存在的话怎么去自动创建呢?最简单的就是open文件的时候选择“w”或者“a”一类的模式,这两类模式下会自动创建不存在的文件,如果是多级文件,则文件的父级目录必须存在否则会创建失败。

注:w模式会先清空文件,慎用。推荐使用“a”模式。文件open的时候指针初始化位置是在内容的最开始处。关于指针,对文件

的读写,指针代表的是读写的起始位置,并向后进行操作。

新建

os.mknod()函数差创建文件,

os.mkdir()函数创建一级目录,

import os

if not os.path.exists('foldername'):
    os.mkdir('foldername')

os.makedirs()函数创建多级目录。

删除

os.remove()函数删除文件,

os.rmdir()函数删除一级目录,

import os

if os.path.exists('foldername'):
    os.rmdir('foldername')

os.removedirs()函数删除多级目录。

方式一,内容存到原文件:

def txt_change(file_path, old_str, new_str):
    with open(file_path, 'r+') as fp:
        data = fp.read()
        # 打印当前指针的位置
        print '源文件的字节总数:', fp.tell()
        # 用新字符串替换旧字符串
        new_data = data.replace(old_str, new_str)
        # 移动指针到文件最开始位置,写入新内容
        fp.seek(0, 0)
        fp.write(new_data)
        # 打印当前指针的位置
        print '新内容的字节总数:', fp.tell()
        # 用于截断文件,如果没有指定 size,则从当前指针位置起后面的所有字符被删除。
        fp.truncate()

注:此方法会清除旧内容,不利于数据恢复。

方式二,内容写到新文件:

def change_txt(old_file, new_file, old_str, new_str):
    with open(old_file, 'a+') as fo:
        # 用w模式,新文件将被清空以存放新内容
        with open(new_file, 'w+') as fn:
            data = fo.read()
            # 用新字符串替换旧字符串
            new_data = data.replace(old_str, new_str)
            fn.write(new_data)

注:选择新文件保存内容,相当于多了一个原文件作为备份,推荐使用此方法。值得注意的是,用于替换的字符串字节总数(UTF-8编码中,一个英文字符占1个字节,一个中文字符占3个字节;GBK编码中,中英文都占两个字节)不得超过待替换的字符串,如果超过,就会覆盖部分原文件内容,这是由硬盘的读写机制决定的,所以,关于这一点我们在使用文件修改时,必须十分小心,及时备份,防止文件丢失。

上面两种方法上都是一次性读写整个文件,当文件太大时,对内存要求很高,如果我们换种思路,按行来操作会怎样?

def c_txt(old_file, new_file, old_str, new_str):
    start = time()
    with open(old_file, 'r+') as fo:
        # 用w模式,新文件将被清空以存放新内容
        with open(new_file, 'w+') as fn:
            modify_times = 0  # 统计修改次数
            data = fo.readline()
            # print 'old_str:', data
            while data:
                if old_str in data:
                    modify_times += 1
                # 用新字符串替换旧字符串
                new_data = data.replace(old_str, new_str)
                fn.write(new_data)
                # print 'new_str:', new_data
                data = fo.readline()
            end = time()
            print '文件修改的次数:', modify_times, '按行读写的总时间:', (end-start)

经过对比,发现还是一次性读写比较节约时间,实际效果等工作中总结再补充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值