Python修改文件的两种方法

Python修改文件的两种方法

目录:

一、以占用内存的方式修改文件

二、以占用硬盘的方式修改文件

引言

文件修改的方法从操作方式上大致可以分为两类,一种是以占用电脑内存的方式,将文件读取到内存中修改再存回硬盘;第二种方法是分别打开和新建一个文件,修改文件后写入到新的文件中,直接保存到硬盘,即占用硬盘的方式。下面我们分别来探讨一下两种方法。

一、以占用内存的方式修改文件

待修改的文件 word1.txt,文件内容如下:

沉默良久,这个为某种超出人类理解力的力量代言的女人,冷酷地封死了汪淼的一切出路。

  “三天后,也就是14日,在凌晨1点钟至5点钟,整个宇宙将为你闪烁。”

  他正坐在王府井天主教堂前。在黎明惨白的天空下,教堂的三个罗马式尖顶像三根黑色的巨指,似乎在为他指出冥冥太空中的什么
  东西。

  汪淼起身要走,一阵从教堂传出的圣乐留住了他。今天不是礼拜日,这可能是唱诗班为复活节进行的排练,唱的是这个节日弥撒中
  常唱的《圣灵光照》。在圣乐的庄严深远中,汪淼再次感到宇宙变小了,变成了一座空旷的教堂,穹顶隐没于背景辐射闪烁的红光
  中,而他则是这宏伟教堂地板砖缝中的一只小蚂蚁。他感觉到自己那颗颤抖的心灵被一只无形的巨手抚摸着,一时间回了脆弱无助
  的孩童时代,意识深处硬撑着的某种东西像蜡一样变软了,崩溃了,他双手捂着脸哭了起来。

  “如果有人祈求佛主保佑另一个主,这是怎么回事呢?”我问,然后详细地说了事情的经过。

  长老默默地看着自己手中的书,但显然没有读,而是在想我说的事,然后他说:“你先出去一会儿,让我想想。”我转身走出门去
  ,知道这很不寻常:长老学识深厚,一般的关于宗教、历史和文化的问题,他都能不假思索地立即回答。我在门外等了有一根烟
  的时间,长老叫我回去。

  “我感觉只有一种可能。”他神色严峻地说。

  “什么?会是什么呢?难道可能有这种宗教,它的主需要其教徒祈求其它宗教的主来拯救?”

  “她的那个主,是真实存在的。”

  我走出长老的门,穿过寺院朝自己的住处走去,这夜是满月,我抬头看看月亮,感觉那是盯着我看的一只银色的怪眼,月光带着一
  股阴森的寒气。

  秦始皇、牛顿、冯.诺伊曼和汪淼站在金字塔顶部的平台上,这个平台与汪淼和墨子相遇时的很相似,架设着大量的天文观测仪器
  ,其中有一部分是欧洲近代的设备。在他们下方,三千万秦国军队宏伟的方阵铺展在大地上,这是一个边长6公里的正方形。在初
  升的太阳下,方阵凝固了似的纹丝不动,仿佛一张由三千万个兵马俑构成的巨毯,但飞翔的鸟群误入这巨毯上空时,立刻感到了下
  方浓重的杀气,鸟群顿时大乱,惊慌混乱地退飞或绕行。汪淼在心里算了算,如果全人类站成这样一个方阵,面积也不过是上海浦
  东大小,比起它表现的力量,这方阵更显示了文明的脆弱。

  汪淼听到一种不间断的类似于雷声的轰鸣,这声音是朝歌的大地上许多奇怪的东西发出的,那是一个个巨大的单摆,每个都有几十
  米高,单摆的摆锤是一块块巨石,被一大束绳索吊在架于两座细高石塔间的天桥上,每座单摆都在摆动中,驱动它们的是一群群身
  穿盔甲的士兵,每个巨摆下都有这样一群士兵,他们合着奇怪的号子,齐力拉动系在巨石摆锤上的绳索,维持着它的摆动。汪淼发
  现,所有巨摆的摆动都是同步的,远远看去,这景象怪异得使人着迷,像大地上竖立着一座座走动的钟表,又像自天而降的许多巨
  大的抽象符号。

  “这是伏曦,”纣王对刚进来的周文王和汪淼介绍那位黑衣人,仿佛他们一直就在那儿似的,而黑衣人才是新来的,“他认为,太
  阳是脾气怪戾的大神,他醒着的时候喜怒无常,是乱纪元;睡着时呼吸均匀,是恒纪元。伏曦建议建起了外面那些大摆,日夜不停
  地摆动,声称这对太阳神有强烈的催眠作用,能使其陷入漫长的沉睡。但直到现在,我们看到太阳神仍醒着,最多只是不时打打盹
  。”

  一个大人和一个小孩儿站在死于武斗的红卫兵的墓前,那孩子问大人:他们是烈士吗?大人说不是;孩子又问:他们是敌人吗?大
  人说也不是;孩子再问:那他们是什么?大人说:是历史。

  伊文斯高举一只拳头,对着人群喊道:“消灭人类暴政!”

  和着涛声和天线在风中的轰鸣,三体战士们齐声高呼:“世界属于三体!”这一天,被公认为地球三体运动的诞生日。

我现在要将文中的“汪淼”修改为“WM”,代码如下:

#!-*-coding:utf-8-*-
old_str = '汪淼'
new_str = 'WM'
f1 = open('word1.txt','r+',encoding="utf-8")  # 以读写方式打开,可读可写
data = f1.read()  # 读取文件内容
print(f1.tell()) # 4574 tell() 方法返回文件的当前位置,即文件指针当前位置。
f1.seek(0) # seek() 方法用于移动文件读取指针到指定位置。
for i in data: # 循环读取
    if old_str in data:
        data=data.replace(old_str,new_str)  # 用新字符串替换旧字符串
print(data)  # 打印修改后的内容
f1.write(data) # 向文件中写入内容(data),默认是utf-8
f1.truncate()  # 用于截断文件,如果指定了可选参数 size,则表示截断文件为 size 个字符。 如果没有指定 size,
则从当前位置起截断;截断之后 size 后面的所有字符被删除。
f1.close()  # 关闭文件

二、以占用硬盘的方式修改文件

待修改的文件 word2.txt,文件内容如下:

一片白云,云被风吹到波束范围外后就消散了,但新的云仍不断在波束内产生,使得那一片圆形的天空像是通向另一个云雾宇宙的时空
蚀洞,孩子看到后说它像 一位巨人爷爷的白头发。      
罗辑和庄颜跟着在草地上奔跑的孩子,来到了天线下面。最初的两个引力波系统分别建在欧洲和北美,它们的天线采用磁悬浮,只能从
基座上悬起几厘米;而这个天线采用反重力,如果愿意,它可以一直升到太空中。
三人站在天线下方 的草地向上望,巨大的圆柱体从他们头顶向前方伸延,像是从两侧向上卷曲的天空。
由于半径很大,底面弧度很小,上面的映像并不失真。
这时夕阳已经照到天线下面,罗辑在映像中看到庄颜的长发和白裙在金色的阳光中飘动,像一个从天 空俯视地面的天使。
罗辑把孩子举起来,她的小手摸到了天线光洁的表面,她使劲向一个方向推着。       
“我能让它转起来吗?”       
“如果你推的时间足够长,它会转的。”庄颜回答,然后微笑着看着罗辑问,“是吗?”
    罗辑对庄颤点点头:“如果时间足够长,她能推动地球呢。”      
    像已经无数次发生过的那样,他们的目光又交织在一起,这是两个世纪前在蒙娜丽莎的微笑中那次对视的继续。
    他们发现庄颜设想的目光语言真的变成了现实,或者说相爱的人类早就拥有了这种语言。
    当他们对视时,丰富的涵义从目光 中涌出,就像引力波束形成的云之井中涌出的白云一般,无休无止。
    但这不是这个世界的语言,它本身就构筑了一个使自己有意义的世界,只有在那个玫瑰色的世界中,这种语言的所有词汇才能找到
    对应物。
    那个世界中的每一个人都是上帝, 都能在瞬间数清沙漠中的每一粒沙并记住它们,都能把星星串成晶莹的项链挂到爱人的颈上...     
    这就是爱吗?      
    这行字显现在他们旁边一个突然出现的低维展开的智子上,这个镜面球体仿佛是上方的圆柱体某处融化后滴下的一滴。
    罗辑认识的三体人并不多,不知道现在与他对话的是谁,不知道这位外星人是在三体世界还是在日益远离太阳系的舰队中。
   “应该是吧。”罗辑徽笑着点点头。      
   罗辑博士,我是来向你抗议的。       
   “为什么?”      
   因为在昨天晚上的演讲中,你说人类迟迟未能看清宇宙的黑暗森林状态,并不是由于文明进化不成熟而缺少宇宙意识,而是因为人
   类有爱。       
   “这不对吗?” 
   对,虽然“爱”这个词用在科学论述中涵义有些模糊,但你后面的一句话就不对了,你说很可能人类是宇宙中唯一拥有爱的种族,正
   是这个想法,支撑着你走完了自己面壁者使命中最艰难的一段。       
   “当然,这只是一种表达方式,一种不严格的...比喻而已。”      
   至少我知道三体世界也是有爱的,但因其不利于文明的整体生存而被压制在 萌芽状态,但这种萌芽的生命力很顽强,会在某些个体
   身上成长起来。       
   “请问您是...”      
   我们以前不认识,我是两个半世纪前曾向地球发出誓告的监听员。       
   “天啊,您还活着?”庄颜惊叫道。      
   也活不了多长时间了,我一直处于脱水状态,但这么长的岁月,脱水的机体也会老化。
   不过我真的看到了自己想着的未来,我感到很幸福。       
   “请接受我们的敬意。”罗辑说。      
   我只是想和您讨论一种可能:也许爱的萌芽在宇宙的其他地方也存在,我们 应该到处鼓励她的萌发和成长。       
   “为此我们可以冒险。”      
   对,可以冒险。       
   “我有一个梦,也许有一天,灿烂的阳光能照进黑暗森林。”      
   这时,这里的太阳却在落下去,现在只在远山上露出顶端的一点,像山顶上镶嵌着的一块光灿灿的宝石。
   孩子已经跑远,同草地一起沐浴在金色的晚霞之中。     
   太阳快落下去了,你们的孩子居然不害怕?      
   “当然不害怕,她知道明天太阳还会升起来的。”

将文中的 “罗辑” 修改为 “LJ”,代码如下:

import os  # 导入模块
old_str = '罗辑'
new_str = 'LJ'
modify_times = 0   # 统计修改次数
f1 = open('word2.txt','r',encoding='utf-8')    # 以“r”(只读)模式打开旧文件
f2 = open('word2_1.txt','w',encoding='utf-8')  # 以“w”(写)模式打开或创建新文件(写模式下,文件存在则重写文件,文件
不存在则创建文件)
for lines in f1: # 循环读
        if old_str in lines:
                lines = lines.replace(old_str,new_str)  # 新字符串替换旧字符串
                modify_times += 1  # 每修改一次就自增一次
        f2.write(lines) # 将修改后的内容后的内容写入新文件
print('文件修改的次数:',modify_times) # 9
f1.close()  # 关闭文件f1
f2.close()  # 关闭文件f2(同时打开多个文件时,先打开的先关闭,后打开的后关闭)
os.replace('word2_1.txt','word2.txt') # 修改(替换)文件名

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

来源:PY学习网:原文地址:https://www.py.cn/article.html