文件和输入输出(二)
一、文件的修改
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)