解析文件. Win32 用戶: 創建一個用來解析 Windows .ini 文件的程序. POSIX 用戶:創建一個解析 /etc/serves 文件的程序. 其它平臺用戶: 寫一個解析特定結構的系統配置文件的程序.
網上的例子多是解析 windows 的win.ini 的,這個相對簡單些。
這裏是解析/etc/services的,由於某些列(各列可以看做配置項)可能爲空,需要對怎麼取出各列和判斷可能爲空的列做些處理。
用dict存儲解析結果:
dict的每個key的名字就是該行的第一列(服務名),這個key的value就是該行其他元素組成的list,且list的每個元素以 配置項名稱 = 配置項值 的形式出現。
# coding:utf-8 import re # 把文件讀取進來, 每行存放到list, 不斷增加list元素, 註釋行忽略 def file_analyze(fname): line_list = list() with open(fname, 'r') as fd: for eachline in fd: if eachline.startswith('#'): continue line_list.append(eachline) return line_list # 用一個dict存放解析結果, dict的每個元素是一個list, dict的每個key-value對是每行的解析結果 # 怎麼區分每列呢?第一二列區分方法用空格 # 第四列用#分割出來就行 # 第三四列的區分方法是把每行去掉第四列後, 再去掉第一列和第二列 # 其中需要對第三列和第四列可能爲空的情況做判斷 # item就是文件的每行 def column_analyze(file_list): for item in file_list: line_analyze_list = list() service_name, tmp_port_protocol, port_protocol, aliases, comment = \ str(), str(), str(), str(), str() if len(item.strip('\n').strip('\s')) == 0: continue for unit in re.split('//s+', item): service_name = unit.split()[0] tmp_port_protocol = unit.split()[1].strip() port_protocol = 'port_protocol = ' + unit.split()[1].strip() line_analyze_list.append(port_protocol) tmp_aliases = unit.split('#')[0].strip(service_name).lstrip().\ strip(tmp_port_protocol) if len(tmp_aliases.strip()) == 0: aliases = 'aliases = ' else: aliases = 'aliases = ' + unit.split('#')[0].\ strip(service_name).\ lstrip().strip(tmp_port_protocol).strip() line_analyze_list.append(aliases) if unit.find('#') < 0: comment = 'comment = ' else: comment = 'comment = ' + unit.split('#')[1].strip().strip('\n') line_analyze_list.append(comment) analyze_dict[service_name] = line_analyze_list return analyze_dict def main(fname, listname): listname = file_analyze(fname) analyze_dict = column_analyze(listname) if __name__ == '__main__': analyze_list = list() analyze_dict = dict() file_name = '/etc/services' main(file_name, analyze_list) print analyze_dict