等待着、等待着,等待着那个能和我一起听雨的人……

IniParser 修改了别人的代码 增加了一些功能

上一篇 / 下一篇  2007-02-12 02:17:55 / 个人分类:Python

#-*- encoding:utf-8 -*-LUPA开源社区a{0_I%j
#文件名:IniParser.pyLUPA开源社区2vWk4J3@`O3V
"""Test code
Descrīption:________LUPA开源社区n[V1Tx3a"s|-v.n
"""
import string
lMF}I0(
|,E6Rw+x"W0        KFILE_NONE,
&cl [ry5H9y$S] I0        KFILE_KEEP_COMMENTS,
X+T6rC EDo0        KFILE_KEEP_TRANSLATIONS
$Q9T ^1l1K\2d YB'y0        ) = range(3)
class IniFile:LUPA开源社区
@uN4JlR4K"j(?
    def __init__(self):LUPA开源社区I{`~o6U-q%{;Ysf/j
        self.file_struct = {}
%vW d+Dt8|GGj0        self.list_separator = ","
c%p1f'U'QVu w0        self.comment_char = ["#","//","!"]LUPA开源社区w#{cZ@
        self.data = ""LUPA开源社区D(LN0pC'E WB0Yj
        self.flag = KFILE_NONE
                  LUPA开源社区'|+V5l8}ib]+nYcu
    def set_comment_char(self,char):LUPA开源社区 m:tw7wY PH8]
        self.comment_char.extend(char) LUPA开源社区 @}k-J!},Gs0et9l
       
d W L$hT0    def set_list_separator(self, separator):
x ^VO4@0        self.list_separator = separatorLUPA开源社区0|p(d^0HR@
       
L^ T-q0D]0    def _parse(self):LUPA开源社区 L,v R C BG dN
        found_comm = False
f k7BB/KW0        for line in self.data:
,pZ;} [_6] zF#a0            line = line.strip()
VL5l0n Gp}0            if not line:
&[7S/E/A2C*L*X1Md3A0                continue
y~ W$~j/peo0            #发现注释
]bp Y GZ'_0            if (line[0] in self.comment_char):LUPA开源社区8Z.A/Sh_(i'`
                #保留注释
|s]5p!Do%[0                if self.flag & KFILE_KEEP_COMMENTS:LUPA开源社区|2o2W ~-L)X1X _
                    #找到第二行
g`fx*}.t1C Z0                    if found_comm:LUPA开源社区I _M7T2C La^
                        str_comm += '\n'LUPA开源社区X/Z(~Zu,Bx!H
                        str_comm2 = line[line.index(line[0]):].strip()LUPA开源社区W6nIv5W,i;h$s
                        str_comm += str_comm2
}$H XQ,UU,D(y^T"A0                    else:LUPA开源社区(R+l~O&R
                        found_comm = TrueLUPA开源社区zx;z*tR
                        str_comm = line[line.index(line[0]):].strip()
j%j xiSy0                else:
^;nAZF dy#zh7M rb)U0                    continueLUPA开源社区XM)T7X[-U
            #发现组名LUPA开源社区u;R"E.yF@
            elif line[0] == "[" and line[-1] == "]":
u'?:t6T(j;T)X8_d0                group_dict = {}LUPA开源社区-Qc9rPK Y a
                group = line[line.find('[')+1:line.find(']')]LUPA开源社区)| W p&Bi~8o
                self.file_struct[group]=group_dict
urT1RIj\J%L0                if found_comm:LUPA开源社区` Jl/[NO2I3Fu#E
                    self.file_struct[group]["comment"]=str_commLUPA开源社区gvD;g$D0Db X)wG
                    found_comm = False
5ME6Iha0{l0                    str_comm = None
p%i#B3a&v|wTh0            #发现键值对zLUPA开源社区0t9Wo/vM)kC
            elif line.find("=") >= 0:LUPA开源社区{t'G5Wan j6ie
                key=line[:line.index("=")].strip()
|*l@B4gx0                value=line[line.index("=")+1:].strip()LUPA开源社区J"u[?2^F,Y
                key = key.strip()
-dDN^/MY{0                value = value.strip()
/[#b'n&I}.hZ'}0                #发现多语言LUPA开源社区kDdWf o?0Z
                if key.find("[") >=0:
5G-_c-r7?vL0                    #保留多语言LUPA开源社区;G WHE%f/v
                    if self.flag & KFILE_KEEP_TRANSLATIONS:
F\#lc#Zf3sS0                        [key,local] = key.split("[")
2SQn?"hP^0                        if type(group_dict[key]) == type(""):LUPA开源社区#|y(zQ+XM-t
                            key_dict={}
6F;Q!Sk*aI0                            key_dict["default"] = group_dict[key]
"u&J8O~r0                        else:
n HZ"c8B8a+H^P!`d0                            key_dict = group_dict[key]
kw4M8{1Q5EH0                        key_dict[local[:-1]] = value
%w;A{@:ise8g0                        group_dict[key] = key_dict
[1ii2Kc;C0                    else:LUPA开源社区-MyDaJZ1C;_s
                        continue
~%T!P u6e0                #发现一般键值对
&s q/hV-~2~j%oh0                else:
jH-j I1iOQ z%K0                    group_dict[key] = value
                if found_comm:LUPA开源社区/d(u?;Q3e$O:]
                    if type(group_dict[key]) == type(""):
]'K0l N_`Zv^0                        key_dict={}
8aH @3L cy0                        key_dict["default"] = group_dict[key]LUPA开源社区$Yb'_-_(H|E/^/^N
                    key_dict["comment"] = str_commLUPA开源社区F1Z+NU mneiB
                    group_dict[key]=key_dict
}~U o$xP oH@(t0                    found_comm = FalseLUPA开源社区y'Tf&n:I2?Xu
                    str_comm = None
    def load_from_file(self, ini_file, flag=KFILE_NONE):
U(]:kNO8`e yWo0        self.flag |= flagLUPA开源社区 |UT/w e{FLC0Bq
        self.data = open(ini_file).readlines()LUPA开源社区Wg },Ld0E ks.?-W7B9C7C;z
        self._parse()
    def load_from_data(self, data, flag=KFILE_NONE):LUPA开源社区V5]#`(nX)V(EEk
        self.flag |= flag
7Q&m,R/EX0        self.data = data.splitlines()
6^mDfEU4C$I6w0fi0        self._parse()
    def to_data(self):
E"pjzy+N0        data = []
"iXJ"bR2g`0        for group in self.get_groups():
?$C_^.p$O t0            head=[]LUPA开源社区b:Z5sZ#U(i+`7br
            line=[]
M.PcoP0            mline=[]LUPA开源社区/Qk@J;dmt `*y
            head.append("[" + group + "]")LUPA开源社区A+O3gKh.];Ve9i
            for key in self.get_keys(group):
d7qg?y,X q0                val = self.get_value(group, key)
_|%F:Kq.m([/C!Q0                if key == "comment":LUPA开源社区"t0W"eg`*yh
                    if val !="":LUPA开源社区;JVQ VM-j
                        head.insert(0,val)LUPA开源社区9EO o(n%lF1k
                    continue
"Mq-MEg _0                if type(val) == type(""):
\!U;}.d#eJ4x7N0                    line.append(key +"="+ val)LUPA开源社区5V8|rD+e'G5Y,z E/Q+W
                else:
+^Fxh3RB"I&vh$d0                    tmp=[]
5L2NDb/q#G+`&`q0                    for locale in val.keys():LUPA开源社区/D9c Wx%M k'^#Y I
                        val = self.get_locale_string(group,key,locale)LUPA开源社区u*c#QP?'ya0c
                        if locale == "default":LUPA开源社区(BU bCs o8j y H*\
                            tmp.append(key +"="+ val)LUPA开源社区pC&O{*V F5b1F1g e
                        elif locale == "comment":
.OrP:J4} U,dPe)BN0                            tmp.append( val)
h7A2B+s0J"f,vr0                        else:
8F'A)FZ{Mw h(P!sm0                            tmp.append(key+"["+ locale+ "]="+ val)LUPA开源社区c w o{%vV M%T/o(NZ!i
                    tmp.sort()
bif^Be@-q"e0U0                    mline.extend(tmp)
P,nb e$\f9j"y0            data.extend(head)LUPA开源社区*y ~#Z|b.h9F
            data.extend(mline)LUPA开源社区;a'tGGb2o
            data.extend(line)LUPA开源社区"]0G Q:q-x9N-cn(c c
        return "\n".join(data)
    def get_start_group(self):LUPA开源社区wj-jSW7f+W1To
        return self.get_groups()[0]
    def get_groups(self):LUPA开源社区o
|GZ(PXO	X
        return self.file_struct.keys()
    def get_keys(self, group_name):LUPA开源社区KbEAzfIdc
        return self.file_struct[group_name].keys()
    def has_group(self, group_name):
%j0f%^0D!a*a(|0        return self.file_struct.has_key(group_name)
    def has_key(self, group_name, key):
5?*F(]n E6p p%K0        return self.file_struct[group_name].has_key(key)
    def has_locale(self, group_name, key, locale):LUPA开源社区PM,RL\5X2~4l
j
        if type(self.file_struct[group_name][key]) == type({}):
Q"j5}&]&O-W0            return self.file_struct[group_name][key].has_key(locale)LUPA开源社区 s4aF }6^p KJ#J,JD
        else:
JF1A$IfZ6g0            return False
    def get_value(self, group_name, key):
d5C ~'?/N)bs0        return self.file_struct[group_name][key]
    def _get_string(self, group_name, key):LUPA开源社区M.k7vPzl/xcH.w
        if type(self.file_struct[group_name][key]) == type({}):
8EnN]3b4I ~0            return self.file_struct[group_name][key]["default"]LUPA开源社区i7k6f-n(U*h7r4_
        else:
,sSG/e0_XN0            return self.file_struct[group_name][key]
-E b"q%|ty4v*{r0       
C.R"A#ia8z+z0    def get_string(self,group_name,key,default):
NJe!v0V9Y,MxM0        """LUPA开源社区X ](k/X$\l)hV"\
        LUPA开源社区O.N%i*bI
        @author:           xuanll
w*m3@0[9f {(v0       
7K;b7jjM$AGP@0        @param self:LUPA开源社区O N|S Nc
        @type self:LUPA开源社区G/d S~*@"O4~4b
        @param group_name: section nameLUPA开源社区%B{mn%~ [7Bpm W
        @type group_name:  const char*
Ns%xC\0\GX'c0        @param key:        key name
/H mR_z1qM0        @type key:         const char*LUPA开源社区kDQ4a ZpH-O;?
        @param default:    default valueLUPA开源社区 |#q5`5NJ2` L
        @type default:     const char*LUPA开源社区Y{4\+|EC{
        @return:           default or key value     
0Q H3ty?"lA}bk5k0        @rtype:            const char*
&gZL8qeLV:`(L?0        """LUPA开源社区aFAU.F1yO&IH
        if self.has_key(group_name, key):
^+d Iu&d0            return self._get_string(group_name, key)LUPA开源社区8\YKtot+v/k
        else:LUPA开源社区/t4ce$}"oG
            return default
)S6BH1p)Bq3E0U/X7nR0       
    def get_locale_string(self, group_name, key, locale):LUPA开源社区1\Q-KeUz:e']
        if self.file_struct[group_name][key].has_key(locale):
E'X@ hH0            return self.file_struct[group_name][key][locale]
1\|lO|9zJ^)Q0        else:
'_*T6F*rc(MEc0            return ""
    _boolean_states = {'1': True, 'yes': True, 'true': True, 'on': True,LUPA开源社区5R$v0tC#z%^j!U_
                       '0': False, 'no': False, 'false': False, 'off': False}
    def get_boolean(self, group_name, key, default):LUPA开源社区p}i,h)u
        ret = self.get_string(group_name, key, default)
(|I4h%r7KHk0        if ret.lower() not in self._boolean_states:
W1A'?!Rqz$k3n0            raise ValueError, 'Not a boolean: %s' % ret
#]IT(PK0        return self._boolean_states[ret.lower()]LUPA开源社区7CQ9x7W-LSG
           
    def get_integer(self, group_name, key, default):LUPA开源社区(O,Rcz0CVPW
        ret = self.get_string(group_name, key, default)
y0O0ix:]'l [@0        return int(ret)
    def get_float(self, group_name, key, default):
^ OP#W Hu;c0        ret = self.get_string(group_name, key, default)
,A+Bm8I{_[ s.AM0        return float(ret)
    def get_string_list(self, group_name, key, default):LUPA开源社区R
U,oJ6X
        ret = self.get_string(group_name, key, default)
)fYH X]0        return ret.split(self.list_separator)
    def get_locale_string_list(self, group_name, key, locale):
R8XQ_s:o0        ret = self.get_locale_string(group_name, key, locale)
(@on/Y0|}TS6q0        return ret.split(self.list_separator)
    def get_boolean_list(self, group_name, key, default):LUPA开源社区-jt[9L*t
        ret = self.get_string_list(group_name, key, default)LUPA开源社区:lT2~gsz&p i(~
        lst=[]LUPA开源社区m;]&x U"[6`(K*n5k5XH
        for i in ret:LUPA开源社区W }t'buy0x7r\1R
            if i.lower() not in self._boolean_states:
h@'JEc?b0                raise ValueError, 'Not a boolean: %s' % i            LUPA开源社区$R7{@)c"~
            lst.append(self._boolean_states[i.lower()])LUPA开源社区~jArV6S
        return lst
    def get_integer_list(self, group_name, key, default):
!DU)u5b[? h YT0        ret = self.get_string_list(group_name, key, default)LUPA开源社区!^(\a5F.U
        return [int(i) for i in ret]
    def get_float_list (self, group_name, key, default):LUPA开源社区1|_;tif
        ret = self.get_string_list( group_name, key, default)LUPA开源社区 _DjM&}$ZZ
        return [float(i) for i in ret]
    def get_comment(self, group_name, key):
P(Ih/|U5V0        return self.file_struct[group_name][key]["comment"]
    def set_value(self, group_name, key, value):
]F6]d oWGb.F0        if not self.has_group(group_name):LUPA开源社区?(AE/R;XO!i
            self.file_struct[group_name] = {}
BRC5~7? HT,Rc*C$E0        self.file_struct[group_name][key] = value
    def set_string(self, group_name, key, string):LUPA开源社区Lfl Hgy5s5v
        if not self.has_group(group_name):
{P_-~)]8uw0            self.file_struct[group_name] = {}LUPA开源社区we9Gf*m9?6L ND(h#S
            LUPA开源社区h5w/Vn P1hg
        if not self.has_key(group_name,key):LUPA开源社区\w6i.C+h${z
            self.file_struct[group_name][key] = str(string)
8S%X5g5HSQ0        elif type(self.file_struct[group_name][key]) == type({}):LUPA开源社区$aFdK3q@)D*L:oM
            self.file_struct[group_name][key]["default"] = str(string)LUPA开源社区7d ^eES#^
        else:
kgm#k1W!v0             self.file_struct[group_name][key] = str(string)  
    def set_locale_string(self, group_name, key, locale, string):LUPA开源社区*@p0k4v
GS'Pq
        if not self.has_group(group_name):LUPA开源社区%I|tZs4D
            self.file_struct[group_name] = {}
        if type(self.file_struct[group_name][key]) == type({}):LUPA开源社区J!h3yMe$J
            self.file_struct[group_name][key][locale] = str(string)
t%K*lBW K]/ru0        else:LUPA开源社区-aZT-@,a-X
            key_dict = {}LUPA开源社区&uH$u.W nO@p/Z
            key_dict["default"] = self.file_struct[group_name][key]LUPA开源社区PeY*`+W
            key_dict[locale] = str(string)
0I3~&z.G2lZVQ*z[0            self.file_struct[group_name][key] = key_dict
    def set_string_list(self, group_name, key, list): 
CV'[BqS\;I0        if not self.has_group(group_name):
A/Wf FmF|~0            self.file_struct[group_name] = {}LUPA开源社区8JX/OD1ud
        value = self.list_separator.join(list)
d"@ RQyMgy0        self.file_struct[group_name][key] = value
    def set_locale_string_list(self, group_name, key, locale, list):
#Dak*Y1QP)UCQSJ0        if not self.has_group(group_name):
x1FMB @ Z|&o0            self.file_struct[group_name] = {}
*c)z/p}Uh5|u0        if not self.has_key(group_name, key):
npG-q*UG0            self.file_struct[group_name][key] = {}LUPA开源社区~]/A\2[bDV6g X
        value = self.list_separator.join(list)LUPA开源社区*mMiJCS
        self.file_struct[group_name][key][locale] = value
        if not self.has_group(group_name):LUPA开源社区z8[O U}lm?
            self.file_struct[group_name] = {}LUPA开源社区#f;qkIC4^U
        value = self.list_separator.join([str(i) for i in list])LUPA开源社区`U-q5Uo~!R*Z%PT
        self.file_struct[group_name][key] = value
    def set_comment(self, group_name, key, comment):
xb7r~#l)O!~ F0        if not self.has_group(group_name):
v`v P ^4Ir:s0            self.file_struct[group_name] = {}LUPA开源社区W7\#Y*@{E
        if key is None:
_9I9|C`]Bh5~VEpA0            self.file_struct[group_name]["comment"] = commentLUPA开源社区.L:{KPC\UD
            return
UJ B0ekHQ0        if not self.has_key(group_name, key):
8~'tl N Ksfg9B0            key_dict={}
~d9rm%f4W X0        elif type(self.file_struct[group_name][key]) == type(""):LUPA开源社区Qm)I:yt
            key_dict={}LUPA开源社区'Ja&_2DQ!bA]
            key_dict["default"] = self.file_struct[group_name][key]
        elif type(self.file_struct[group_name][key]) == type({}):LUPA开源社区YV
AIZPs`C
            key_dict = self.file_struct[group_name][key]
        key_dict["comment"] = comment
6E7Hkvpo2sK6m K \M0        self.file_struct[group_name][key] = key_dict
    def remove_group(self, group_name):LUPA开源社区C	VXX&W(M`CF&t
        self.file_struct.pop(group_name)
    def remove_key(self, group_name, key):
7^] B%x;]&jf!N0        self.file_struct[group_name].pop(key)
    def remove_comment(self, group_name, key):
3Z8J6[ q j!c,P0        self.file_struct[group_name][key].pop("comment")
3I$R6Zn0M0a:x.mO0K0        LUPA开源社区^#[dTs%~3q
    def write(self, filename):
7Jl |]l0        """LUPA开源社区#f"jV3`0r P
       
:r:G%qxx-@%G9L;f0        @author:        xuanll
lzM3p6QoT X*e0        LUPA开源社区z&c5j Gl7Y
        @param self:    LUPA开源社区}5@"u0Qm.uO6}
        @type self:LUPA开源社区)G$Y)p%E_%Rgc r
        @param fp:      file()LUPA开源社区cE{6_*RR }9C,u
        @type fp:       file
@ uF-\4g `3]O0        @return:        None
hz5h!N*eHG*O t U @T/T0        @rtype:         None
e"b;V b-L };Q0        """
;]:I&x8^\/e0        fp = file(filename, 'w')
b+s M%CIE0        for section in self.file_struct:
Mp6@ [7vT7G/p0            for (key, value) in self.file_struct[section].items():
+_F/f\JT0                if key == 'comment':
#M yD r5OX3z"S0                    fp.write("%s\n"%value)LUPA开源社区.J"G G.E0Ug;B1L {
            fp.write("[%s]\n" % section)
!O4US5ni{~0            for (key, value) in self.file_struct[section].items():
v5`sd_'U0                if key == 'comment':LUPA开源社区5N jB+\ Zz
                    continueLUPA开源社区 r{)\+}7vqkP
                if key != "__name__":
v1?+B-W Uo-~0                    if (type(value) == type({})):
?7oH.Y(e W0                        fp.write("%s\n" % (str(value["comment"]).replace('\n', '\n'))) LUPA开源社区DHrF&P
                        fp.write("%s = %s\n" % (key, str(value["default"]).replace('\n', '\n\t')))LUPA开源社区H j4|2{9JC+^1\
                    else:
z@7jyN9K0                        fp.write("%s = %s\n" % (key, str(value).replace('\n', '\n\t')))LUPA开源社区'}6T8BE$|
            fp.write("\n")
if __name__=="__main__":LUPA开源社区Li#}X"klB
P
    a=IniFile()LUPA开源社区8?8j!l!|3e [
    a.set_comment_char(["@", '/'])
P\p5X)c~0    #flag = KFILE_NONELUPA开源社区"r/RU&p?L
    #flag = KFILE_KEEP_COMMENTS
`&m3Z}?0    #flag = KFILE_KEEP_TRANSLATIONS
P5Zx5fZ/@1c{*]0    flag = KFILE_KEEP_COMMENTS|KFILE_KEEP_TRANSLATIONSLUPA开源社区F3_8E#I)_:[6k
    a.load_from_file("test.ini",flag)
    LUPA开源社区M5y/?
U0a
    print "################################################################################"
MHC*X5m*fXP[0    LUPA开源社区.X2I`JcGt
    print a.get_string('model','type1','hehe')LUPA开源社区Ex-}q4g~(L,L
    a.set_string('model','type1',"hello")
sW7`1g1Sb/Tn0    #a.set_value('model','type',"hello")
2Y6K#P9c vxc&VE0    print a.get_string('model','type','hehe')
%V L&^Ob!O0   
)Xm,]cq+?5\/T&y0    print a.get_keys('model')LUPA开源社区Xt!W3G:i{o6m/F
    print a.get_boolean('RowOp','StrCol1','On')LUPA开源社区ml ]m\|? YM
    print a.get_boolean_list('RowOp','StrCol1','1,1,0')
i8Ra:V4`0c ^/u@2`(W0    print a.comment_char LUPA开源社区 GZA-J6^ Q U(P
    print a.get_comment("RowOp","ComposeFieldType")
F(N:K&Tdr0    a.set_string('RowOp','ComposeFieldType',"44")LUPA开源社区nHC$p~$HyD9D`
    l = a.get_string_list('Perf2','field','')LUPA开源社区Xi#e&d bX*U7i
    print l
c s&S"?}9a^N!Oi0    print ("%s %s %i"%(l[0],l[1],int(l[2])))
$s~u{*t/i5r K wY0    print a.to_data()LUPA开源社区{#a0}(P*V o
    a.set_string('A','a','a')LUPA开源社区y m7JTE
    a.set_comment( 'A', None,'//hahahaha')LUPA开源社区Vb-Pl6v i
    a.write('tt.ini')LUPA开源社区){+MX&}TTwSr
    print "################################################################################"
t6m/@I0h*QMQ.r0   
*b j"LfU7qm0   

TAG: python ini Python

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的栏目

日历

« 2008-09-08  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 885
  • 日志数: 7
  • 建立时间: 2005-12-11
  • 更新时间: 2007-08-31

RSS订阅

Open Toolbar