Python Cookbook-2.3 搜索和替换文件中的文本
任务
需要将文件中的某个字符串改变成另一个。
解决方案
字符串对象的 replace 方法提供了字符串替换的最简单的办法。下面的代码支持从一个特定的文件(或标准输入)读取数据,然后写人一个指定的文件(或标准输出):
importos,sys
nargs = len(sys.argv)
if not 3<= nargs <= 5 :
print "usage: $s search_text replace_text [infile [outfile]]" %\
os.path.basename(sys.arqv[0])
else:
stext = sys.arqv[1]
rtext = sys.argv[2]
input_file =sys.stdin
output_file = sys.stdout
if nargs >3:
input_file = open(sys.argv[3])
if narqs >4:
output_file = open(sys.argv[4],"w')
for s in input_file:
output_file.write(s.replace(stext,rtext))
output.close()
input.close()
讨论
本节给出的解决方案非常简单,但那也正是精彩的地方——如果简单的东西已经够用了,为什么要用复杂的东西?正如开始的“shebang”(shell 头描述)行所示,这个脚本是一个简单的主脚本,而不是那些被用来导人的模块,它直接运行在一个 shell 命令行提示中。脚本检查传递给它的参数以确定要搜索的文本,用于替代的文本,输入文件(默认是标准输入),输出文件(默认是标准输出)。然后循环遍历输入文件中的每一行完成了对每行文本的字符串替换之后,再写入到输出文件。这就结束了。准确点说最后还关闭了所有的文件。
如果内存充裕到能够轻松放入两份输人文件(一份是原版的,另一份是完成了替代之后的,因为字符串是不能被改变的,所以必须有两个拷贝),我们就可以进一步地提高速度。一次性完成对所有内容的处理,而不用循环。今天的低端计算机至少都有 256MB以上的内存,处理一个 100MB 左右的文件并不是什么问题,而且处理超过100MB的文件的情况也很少。所以,我们也可以用一行语句替换掉那个循环:
output_file.write(input_file.read().replace(stext, rtext))