分享

每周一题——读写配置文件 Python讨论区/精华帖...

 accesine 2005-09-07
我的,呵呵,别笑话。
ini文件的格式参照了这里
http://en./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./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 =



_________________
I like Gentoo Linux!
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多