第十四章:应用构建模块-fileinput:命令行过滤器框架-原地过滤

14.9.3 原地过滤
另一种常见的文件处理操作是原地(in-place)修改一个文件的内容,而不是创建一个新文件(其中包含修改后的内容)。例如,如果一个子网范围改变,那么UNIX主机文件就可能需要更新。
第十四章:应用构建模块-fileinput:命令行过滤器框架-原地过滤_第1张图片
要自动完成这个修改,安全的做法是根据输入创建一个新文件,然后用编辑后的副本替换原来的文件。fileinput使用inplace选项支持这种方法。

import fileinput
import sys

from_base = sys.argv[1]
to_base = sys.argv[2]
files = sys.argv[3:]

for line in fileinput.input(files,inplace=True):
    line = line.rstrip().replace(from_base,to_base)
    print(line)

尽管前面的脚本使用了print(),但是由于fileinput将标准输出重定向到所覆盖的文件,所以不生成任何输出。
更新后的文件包含了10.16.0.0/16网络上所有服务器更改后的IP。
第十四章:应用构建模块-fileinput:命令行过滤器框架-原地过滤_第2张图片
处理开始之前,会使用原来的文件名加上.bak扩展名来创建一个备份文件。

import fileinput
import glob
import sys

from_base = sys.argv[1]
to_base = sys.argv[2]
files = sys.argv[3:]

for line in fileinput.input(files,inplace=True):
    if fileinput.isfirstline():
        sys.stderr.write('Started processing {}\n'.format(
            fileinput.filename()))
        sys.stderr.write('Directory contains: {}\n'.format(
            glob.glob('etc_hosts.txt*')))
    line = line.rstrip().replace(from_base,to_base)
    print(line)

sys.stderr.write('Finished processing\n')
sys.stderr.write('Directory contains: {}\n'.format(
    glob.glob('etc_hosts.txt*')))

输入结束时会删除这个备份文件。
第十四章:应用构建模块-fileinput:命令行过滤器框架-原地过滤_第3张图片

你可能感兴趣的:(Python标准库)