代碼: |
#!C:\Python24\python.exe import re import string NoSectionException = ‘NoSectionException‘ NoKeyException = ‘NoKeyException‘ class IniFileParser: ‘‘‘parse ini file described in http://en.wikipedia.org/wiki/Ini_file. no functions for write, only read. :)‘‘‘ def __init__(self): self.section_obj = dict() def load(self, filename): f = open(filename, ‘r‘) while 1: line = f.readline() if not line: break line = line.strip(‘\n‘) line = line.strip() # skip comments if line == "" or line.startswith(‘;‘) or line.startswith(‘#‘): continue match_section = re.compile(r‘^\[([\w\s\.]*)\]$‘).match(line) if match_section: # section name line line = match_section.group(1) # get section name sec_keys = dict() self.section_obj[line] = sec_keys else: # key=value line re_comment = re.compile(r‘[;#].*‘) line = re_comment.sub(‘‘, line) # remove comments in line [key, value] = map(string.strip, line.split(‘=‘, 1)) sec_keys[key] = value f.close() def sections(self): result = self.section_obj.keys() result.sort() return result def has_section(self, section): return section in self.section_obj.keys() def keys(self, section): if not self.has_section(section): raise NoSectionException result = self.section_obj[section].keys() result.sort() return result def has_key(self, section, key): return self.section_obj[section].has_key(key) def get_value(self, section, key): if not self.has_section(section): raise NoSectionException if not self.has_key(section, key): raise NoKeyException return self.section_obj[section][key] |
代碼: |
#!C:\Python24\python.exe import unittest from IniFileParser import * class TestIniFileParser(unittest.TestCase): def setUp(self): self.ini = IniFileParser() self.ini.load(‘test.ini‘) def testsections(self): self.assertEqual(self.ini.sections(), [‘section1‘, ‘section2‘]) def testhassections(self): self.assertTrue(self.ini.has_section(‘section1‘)) self.assertTrue(self.ini.has_section(‘section2‘)) self.assertFalse(self.ini.has_section(‘section3‘)) def testkeys(self): self.assertEqual(self.ini.keys(‘section1‘), [‘var1‘, ‘var2‘]) self.assertEqual(self.ini.keys(‘section2‘), [‘var1‘, ‘var2‘]) self.assertRaises(NoSectionException, self.ini.keys, ‘section3‘) def testhaskey(self): self.assertTrue(self.ini.has_key(‘section1‘, ‘var1‘)) self.assertTrue(self.ini.has_key(‘section1‘, ‘var2‘)) self.assertTrue(self.ini.has_key(‘section2‘, ‘var1‘)) self.assertTrue(self.ini.has_key(‘section2‘, ‘var2‘)) def testgetvalue(self): self.assertEqual(self.ini.get_value(‘section1‘, ‘var1‘), ‘foo‘) self.assertEqual(self.ini.get_value(‘section1‘, ‘var2‘), ‘doodle‘) self.assertEqual(self.ini.get_value(‘section2‘, ‘var1‘), ‘baz‘) self.assertEqual(self.ini.get_value(‘section2‘, ‘var2‘), ‘shoodle‘) self.assertRaises(NoSectionException, self.ini.get_value, ‘section3‘, ‘var1‘) self.assertRaises(NoKeyException, self.ini.get_value, ‘section1‘, ‘var3‘) if __name__ == ‘__main__‘: #unittest.main() suite = unittest.makeSuite(TestIniFileParser) unittest.TextTestRunner(verbosity=2).run(suite) |
引用: |
[section1] ; some comment on section1 var1 = foo var2 = doodle ; some comment on section1.var2 [section2] # some comment on section2 var1 = baz # some comment on section2.var1 var2 = shoodle # [section3] # var1 = bar ; var2 = |
聯(lián)系客服