標籤:python python核心編程 第九章習題
解析檔案. Win32 使用者: 建立一個用來解析 Windows .ini 檔案的程式. POSIX 使用者:建立一個解析 /etc/serves 檔案的程式. 其它平台使用者: 寫一個解析特定結構的系統設定檔的程式.
網上的例子多是解析 windows 的win.ini 的,這個相對簡單些。
這裡是解析/etc/services的,由於某些列(各列可以看做配置項)可能為空白,需要對怎麼取出各列和判斷可能為空白的列做些處理。
用dict儲存解析結果:
dict的每個key的名字就是該行的第一列(服務名),這個key的value就是該行其他元素組成的list,且list的每個元素以 配置項名稱 = 配置項值 的形式出現。
# coding:utf-8import 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_dictdef 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
本文出自 “linux與網路那些事” 部落格,請務必保留此出處http://khaozi.blog.51cto.com/952782/1896307
python核心編程第9章習題:9-7