一键注释host
需求驱动行动。由于测试需要,经常要配置host,修改配置hosts文件,一来找hosts文件的目录是件麻烦事,二来host多了,注释掉哪些,需要用哪些,就搞混了。不注释多余的host容易引起冲突和出错,比如下面的两个host就会出错:
10.240.19.27 www.cnblogs.com
10.240.19.28 www.cnblogs.com
我忘了哪个会生效,但是可能你希望生效的没有生效,导致出错。
思路很简单,就是注释未经注释的非空行,代码如下(comment_host.py):
1 # -*- coding: utf-8 -*- 2 3 import os 4 import sys 5 import shutil 6 7 # global vars 8 # host_path = sys.argv[1] 9 host_path = r\'c:\windows\system32\drivers\etc\hosts\' 10 11 copy = os.path.join(os.path.dirname(host_path), \'hosts_copy\') 12 if os.path.isfile(copy): 13 os.remove(copy) 14 15 shutil.copy(host_path, copy) 16 17 fr = open(copy, \'r\') 18 fw = open(host_path, \'w+\') 19 lines = fr.readlines() 20 21 for each_line in lines: 22 if each_line.strip() == \'\': # blank line 23 pass 24 elif each_line.strip()[0] == \'#\': # a comment line already 25 pass 26 elif each_line.strip()[0] != \'#\': # not a comment line 27 each_line = \'# \' + each_line 28 fw.write(each_line) 29 30 fw.close() 31 fr.close()
处理这类文本文件、配置文件之类的,我特别注意空行,多余空格,tab等,生怕“阴沟里翻船”,有一个函数可以帮忙,就是strip(),strip的主要作用是去掉行首和行尾的指定字符。这里我要对付的是空白字符,包括换行符,空格、制表符等。注意,不是只有空格,而是所有空白字符,如:\t,\r,\n和\’ \’(空格)。
用strip()删除配置文件里多余空白字符十分有效,可以用下面的代码(simplify.py):
# -*- coding: utf-8 -*- import os import sys import shutil # global vars # host_path = sys.argv[1] host_path = r\'c:\windows\system32\drivers\etc\hosts\' copy = os.path.join(os.path.dirname(host_path), \'hosts_copy\') if os.path.isfile(copy): os.remove(copy) shutil.copy(host_path, copy) fr = open(copy, \'r\') fw = open(host_path, \'w+\') lines = fr.readlines() for each_line in lines: each_line = each_line.strip() if each_line == "": continue fw.write(each_line) if each_line != lines[-1]: fw.write(\'\n\') fw.close() fr.close()
当然,文件名可以作为参数传入。这样,效果就是配置文件的内容紧缩了(见下图A和B),对于只需要程序去读的配置文件,避免出错的方法就是不给“空白”留机会。
(图A)
(图B)