文件和输入输出(二)

一、文件的修改

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)
原文地址:https://www.cnblogs.com/yangmingxianshen/p/7760868.html