- 论坛徽章:
- 0
|
每周一题——读写配置文件。
我的,呵呵,别笑话。
ini文件的格式参照了这里 http://en.wikipedia.org/wiki/Ini_file
也参考了Python的ConfigParser模块的文档
IniFileParser.py
- #!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]
复制代码
Unit Test: TestIniFileParser.py
- #!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)
复制代码
ini file for test: test.ini
[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 = |
|