• 文件和输入输出(二)


    一、文件的修改

    python对象中的内容一般是不会去修改的,但是如果想强行修改,也是有手段可以实现的。

    文件对象本身是不支持修改操作,此处我们所谓的修改其实是创建一个新的文件,然后重命名替换。

    下面会叙述三种修改的方式

    1.read读入一次性替换

    文件修改的步骤有如下几步:

    (1)、创建一个新的文件

    (2)、打开需要修改的文件

    (3)、替换掉需要修改的内容

    (4)、将修改后的内容写入到新的文件中

    (5)、删除原文件,将新文件改名。

    下面是一个例子:要将文件中的‘明天’修改成"**"

    #原文件
    昨天是昨天
    昨天的明天是今天
    明天的昨天是今天
    此刻在当下
    
    #代码
    d = open('kebi','w',encoding='utf-8')    #创建一个新文件
    f = open('maoxian','r',encoding='utf-8')  #打开需要修改的文件
    content = f.read().replace('明天','**')  #替换掉指定的内容
    d.write(content)   #写入到新的文件
    f.close()  #关闭文件,不然无法删除
    d.close()
    import os
    os.remove('maoxian')   #将原文件删除
    os.rename('kebi','maoxian')  #将新的文件改名

    2.使用for循环逐行替换

    上面使用read()进行读入,使用replace替换,但是read()是一次读取所有内容,然后放在内存中进行修改。但是当文件过于巨大的时候,非常的消耗内存。

    还是刚才的那个例子,将”昨天“改为”ZT“
    #原文件
    昨天是昨天
    昨天的明天是今天
    明天的昨天是今天
    此刻在当下
    
    #代码
    d = open('kebi','w',encoding='utf-8')   #创建一个新文件
    f = open('maoxian','r',encoding='utf-8')  #打开旧文件
    for line in f:   #一行一行修改,减少负荷
        line = line.replace('昨天','ZT')
        d.write(line)
    f.close()    #关闭文件
    d.close()
    import os
    os.remove('maoxian')   #删除原文件,然后改名
    os.rename('kebi','maoxian')
    
    
    #修改之后的文件
    ZT是ZT
    ZT的明天是今天
    明天的ZT是今天
    此刻在当下

    3.引入if语句替换部分内容

    如果只想修改其中的某一行,可以引入if条件判断。

    #原文件,只修改第一个明天
    ZT是ZT
    ZT的明天是今天
    明天的ZT是今天
    此刻在当下
    
    #代码
    d = open('kebi','w',encoding='utf-8')
    f = open('maoxian','r',encoding='utf-8')
    count = 0
    for line in f:
        if "明天" in line and count == 0:
            line = line.replace('明天','mingtian')
            d.write(line)
            count = 1
        else:
            d.write(line)
    
    f.close()
    d.close()
    import os
    os.remove('maoxian')
    os.rename('kebi','maoxian')
    
    #修改后的文件
    ZT是ZT
    ZT的mingtian是今天
    明天的ZT是今天
    此刻在当下

    二、with操作

    with这种机制开发出来就是为了解决许多时候忘记了关闭文件对象,而产生的不必要的损失。

    with有点类似于for循环,with下面的代码深度比with低一级,当with中的代码都结束之后,会自动关闭对象。

    #打印一个文件中的内容
    f = open('maoxian','r',encoding='utf-8')
    content = f.read()
    print(content)
    f.close()
    
    
    #with结束,它所包含的下层代码。
    with open('maoxian','r',encoding='utf-8') as f:
        content = f.read()
        print(content)
    
    #with可以同时指代包含多个对象。
    with open('maoxian','r',encoding='utf-8') as f,open('kebi','w',encoding='utf-8') as d:
        content = f.read()
        d.write(content)
  • 相关阅读:
    加强面向对象设计思想需要学习的知识
    (转载)myeclipse快捷键
    tomcat的jdbc驱动
    mysql常见设置
    不用配制数据源如何用JDBC连接access数据库
    关于updatePanel
    jsp常见问题
    Servlet问题
    Rational Rose未找到suite objects.dll问题
    jsp+servlet+javabean实现简单的查询
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/7760868.html
Copyright © 2020-2023  润新知