Differences between revisions 8 and 34 (spanning 26 versions)
Revision 8 as of 2005-09-14 08:44:12
Size: 5940
Editor: limodou
Comment:
Revision 34 as of 2009-11-28 21:11:23
Size: 10270
Editor: Elias
Comment: 删除对PageComment2组件的引用
Deletions are marked like this. Additions are marked like this.
Line 27: Line 27:
 * can save config items order
 * support multi data types: string, unicode, int, float, list/tuple, dict, etc, you can save them to or regain them from config file
 * can convert to dict '''new'''
 * auto detect BOM of utf-8 file '''new'''
Line 31: Line 35:
 * '''Now the project is hosted in code.google, so you can visit it in [http://code.google.com/p/dict4ini/ here].'''
Line 32: Line 37:
 * Download it from here attachment:dict4ini.py  * Download it from [http://dict4ini.googlecode.com/files/dict4ini-0.9.2.zip dict4ini-0.9.2.zip]

== About license ==

 * before GPL
 * now BSD you can see it in the source code

== What's new? ==
 * 2007/06/26 Version 0.9.1
  * Fix float convert bug
 * 2007/06/13 Version 0.9
  * Thanks for Victor Stinner giving a output format patch, so you can define your own output format "%s = %s" to anything you want, for example "%s=%s" or "%s:%s". And Dict4Ini will auto remove '%s' from the fromat string, and the strip() the rest of the string, then use it to split the key and value in Ini file. For example, if you using "%s:%s", Dict4Ini will get "%s:%s".replace('%s', '').strip(), then use ':' to split the line.
 * 2007/04/20 Version 0.8
  * Add exception process when parsing file
  * Add BOM detect
 * 2007/04/19 Version 0.7
  * Fix '\' escape
 * 2006/03/21 Version 0.6
  * Fix ordereditems bug.
 * 2006/01/04 Version 0.5
  * 2006/01/04
   * Add ordereditems() method, so you can get the items according the ini file definition
  * 2005/12/30
   * Support onelevel parameter, you can set it True, than only one level can be used, so that the key can include section delimeter char in it.
   * Support sectiondelimeter parmeter, you can set the section delimeter to which you want
 * 2005/12/12 Version 0.4
  * Fixed a bug about "\" in option's value, thanks to Andreas Kaiser
 * 2005/12/09 Version 0.3
  * Adding dict() method, then you can change the DictIni object to dict type, so you can really use it as a dict alternative
 * 2005/10/16 Version 0.2
  * Saving config items order
  * Support float format
Line 36: Line 72:
=== Examples 1 Create a ini file === === Example 1 Create a ini file ===
Line 43: Line 79:
    x.common.list = [3, 'Hello', 'have spaces']     x.common.list = [3, 1.2, 'Hello', 'have spaces']
Line 49: Line 85:
list = 3,Hello,"have spaces", list = 3,1.2,Hello,"have spaces",
Line 55: Line 91:
In this time, the Dict4Ini support number, list, string, unicode data type, for others you should convert yourself. In this time, the Dict4Ini support int, float, list/tuple, string, unicode data type, for others you should convert yourself.
Line 70: Line 106:
[3, 'Hello', 'have spaces'] [3, 1.2, 'Hello', 'have spaces']
Line 73: Line 109:
The data is auto converted to its original type. Then you also can see, the order of options don't be holding. In many cases, it's not very seriously. The data is auto converted to its original type.
Line 102: Line 138:
=== Examples 4 Saving comments in ini file === === Example 4 Saving comments in ini file ===
Line 140: Line 176:
Note: You should specify the coding used in the .py file. In this case is utf-8. Then I assign x.common.name with a unicode string. Note: You should specify the coding used in the .py file. In this case is utf-8. Then I assign x.common.name with a unicode string. If you don't specify the encoding in create instance of the DictIni, the Dict4Ini will auto find the default encoding in the system in turns of:

 * local.getdefaultlocale()[1]
 * sys.getfilesystemencoding()
 * utf-8
Line 162: Line 202:
=== Example 6 Using multi section ===

{{{#!python
import dict4ini
x = dict4ini.DictIni('test.ini')
x.common.settings.a = 1
x.common.settings.b = ["3", "hello"]
x.special.name = 'limodou'
x.special.homepage = 'http://www.donews.net/limodou'
x.save()}}}

You don't need to care if subsection is created, you need to just use it.

The result of the ini file will be:

{{{ [common/settings]
    a = 1
    b = "3",hello,


    [special]
    homepage = http://www.donews.net/limodou
    name = limodou}}}

=== Example 7 Getting ordered options ===
Sometimes we need to keep the order or the options according to the ini file, so how to get the ordered items?

{{{#!python
ini = dict4ini.DictIni('x.ini')
for key, value in ini.ordereditems(ini):
   print key, value
}}}
This example is dealing with the first level section.

{{{#!python
ini = dict4ini.DictIni('x.ini')
for key, value in ini.ordereditems(ini.autostring):
   print key, value
}}}
This example is dealing with certain section.
Line 163: Line 244:

== FAQ ==

=== 1. Can I delete an option? ===

A: Yes. For example:
{{{#!python
import dict4ini
x = dict4ini.DictIni('test.ini')
del x.a
x.save()}}}

=== 2. How to use 'xxx.xxx' style option key? ===

A: Easy. Just using dict syntax, for example:

{{{#!python
x['common']['xxx.xxx'] = 'a'}}}

or

{{{#!python
x.common['xxx.xxx'] = 'a'}}}

=== 3. How to deal the key including section delimeter char, just like '/' ===

A: As you creating the DictIni instance, you can specify a "onelevel=True" parameter:

{{{#!python
x = dict4ini.DictIni('inifile', onelevel=True)
}}}

But it'll not support multi section again. So you can also defined another sectiondelimeter char different from '/', just like:

{{{#!python
x = dict4ini.DictIni('inifile', sectiondelimeter='@')
}}}

But every time you called dict4ini.DictIni() you may need including sectiondelimeter parameter.
Line 166: Line 286:

 * This is a neat piece of software, but why is it GPL licenced? -- cmkl.
 * Because I like GPL :) -- limodou
 * 重要需求,可以支持多行内容的读取?比如说:
{{{
[code]
c1 = """
import sys
print dir(sys)
"""
}}} 这样类似的代码内容? -- ZoomQuiet

::-- limodou [DateTime(2005-09-14T06:31:19Z)] TableOfContents

1. Dict4Ini

This module is used to process ini format configuration file. It acts just like a dict, but you can also access it's sections and options with attribute syntax, just like x.test.

1.1. Why reinvent this module?

I used Config4Obj module for GoogleTalkBot software (confbot) to deal with configuration file. But I found its lacks on:

  • Only can access options as x['name']['o'], but not as x.name.o
  • You must create section first, then you can access its options. So if you didn't create x['name']={} section, so you cann't do x['name']['o'] = 3
  • The option's data can be saved as string format, but as read out again, Config4Obj cann't convert it to their original value type, so you must conver it yourself. I didn't tried validate module ships with Config4Obj.

  • Didn't support unicode

Above is only my opinions, so they may be not right.

So I decide to reinvent a new module to solve these lacks, I named it as Dict4Ini, it means you can access the config object just like a dict.

1.2. What's it features

  • as simple as others
  • you can access options according to dict syntax, just like x['name']['o'] = 1, x['name'].keys(), x['name'].values(), etc.
  • you also can access options according to attr syntax, just like x.name.o = 1, x.name.keys(), x.name.values(), etc. So the name must be Identifier or single word.
  • you can save comments in it(but this feature is not tested so much)
  • support multi level section, subsection name will just like: [firsub/secsub]
  • can save config items order
  • support multi data types: string, unicode, int, float, list/tuple, dict, etc, you can save them to or regain them from config file
  • can convert to dict new

  • auto detect BOM of utf-8 file new

  • It's a little module, just for my mind, so if you like, you could try it, but if you don't like, just skip it, that's ok

1.3. Where can I download it?

1.4. About license

  • before GPL
  • now BSD you can see it in the source code

1.5. What's new?

  • 2007/06/26 Version 0.9.1
    • Fix float convert bug
  • 2007/06/13 Version 0.9
    • Thanks for Victor Stinner giving a output format patch, so you can define your own output format "%s = %s" to anything you want, for example "%s=%s" or "%s:%s". And Dict4Ini will auto remove '%s' from the fromat string, and the strip() the rest of the string, then use it to split the key and value in Ini file. For example, if you using "%s:%s", Dict4Ini will get "%s:%s".replace('%s', ).strip(), then use ':' to split the line.

  • 2007/04/20 Version 0.8
    • Add exception process when parsing file
    • Add BOM detect
  • 2007/04/19 Version 0.7
    • Fix '\' escape
  • 2006/03/21 Version 0.6
    • Fix ordereditems bug.
  • 2006/01/04 Version 0.5
    • 2006/01/04
      • Add ordereditems() method, so you can get the items according the ini file definition
    • 2005/12/30
      • Support onelevel parameter, you can set it True, than only one level can be used, so that the key can include section delimeter char in it.
      • Support sectiondelimeter parmeter, you can set the section delimeter to which you want
  • 2005/12/12 Version 0.4
    • Fixed a bug about "\" in option's value, thanks to Andreas Kaiser
  • 2005/12/09 Version 0.3
    • Adding dict() method, then you can change the DictIni object to dict type, so you can really use it as a dict alternative

  • 2005/10/16 Version 0.2
    • Saving config items order
    • Support float format

1.6. Examples

1.6.1. Example 1 Create a ini file

   1     import dict4ini
   2 
   3     x = dict4ini.DictIni('test.ini')
   4     x.common.name = 'limodou'
   5     x.common.bool = 1
   6     x.common.list = [3, 1.2, 'Hello', 'have spaces']
   7     x.save()

This example will save option to test.ini. As you can see, you needn't create section "common" at first, just think it's there, it's ok. The result of test.ini is:

{{{[common] list = 3,1.2,Hello,"have spaces", bool = 1 name = limodou}}}

And you can see, once the value has special chars, just like ' ', ',', '\"', etc, the string will be quoted by double quoter. But "Hello" is a single word, and it has not the special chars, so it won't be quoted. If the value is number, it'll be just like number literal, but if the value is number string, it'll be quoted by double quoter.

In this time, the Dict4Ini support int, float, list/tuple, string, unicode data type, for others you should convert yourself.

1.6.2. Example 2 Open an existed ini file

   1     import dict4ini
   2 
   3     x = dict4ini.DictIni('test.ini')
   4     print x.common.bool
   5     print x.common.list
   6     print x.common.name

So it's easy. The result will be:

Dict4Ini (last edited 2009-12-25 07:13:47 by localhost)