1. 程式人生 > >將python資料結構匯出成字串並自動縮排格式化

將python資料結構匯出成字串並自動縮排格式化

python可以做輕量級伺服器,因此我就想要怎麼給python做導表工具,如果資料格式不用json而直接用python的格式要怎麼做。於是乎就寫了個類似json模組一樣的工具。這個工具可以將python資料結構直接匯出成字串並格式化縮排。匯出的文字直接就可以當作python指令碼使用,匯入到其他python腳本里就可以直接使用字典等資料了。

# 將dict物件格式化輸出成字串
"""
author:kaluluosi
date:2015-11-02

dump pyton object to string and format it.

"""

_lines = []
indent=4

def tab(depth=0):
    return ' '*indent*depth

def toStr(s):
    return "\"%s\""%s

def islambda(s):
    return 'lambda' in s

def writeline():
    _lines.append('\n')

def parse(obj,depth=0):
    if isinstance(obj,str):
        if islambda(obj):
            _lines.append(obj)
        else:
            _lines.append(toStr(obj))
    else:
        if isinstance(obj,dict):
            parse_dict(obj,depth)
        elif isinstance(obj,list):
            parse_list(obj,depth)
        else:
            _lines.append(str(obj))

def parse_dict(dic,depth=0):
    _lines.append('{') #開頭
    writeline() #換行
    depth+=1 #縮排增加
    
    #迴圈遍歷所有的item
    for k,v in dic.items():
        _lines.append(tab(depth)) #縮排
        parse(k,depth) #
        _lines.append(':')
        parse(v,depth) #值
        _lines.append(',')
        writeline() #換行

    depth-=1 #縮排還原
    _lines.append(tab(depth)+'}') #結束

def parse_list(lst,depth=0):
    _lines.append('[') #開頭
    writeline() #換行
    depth+=1 #縮排增加
    
    #迴圈遍歷所有的item
    for v in lst:
        _lines.append(tab(depth))
        parse(v,depth)
        _lines.append(',')
        writeline() #換行

    depth-=1 #縮排還原
    _lines.append(tab(depth)+']') #結束

def dumps(obj,indent=True):
    parse(obj)
    c=''
    if indent:
        c = ''.join(_lines)
    else:
        c = ''.join([l.strip() for l in _lines])
    return c



def main():
    dic = { 'a':1,1:'2',2:{1:1,2:2},3:[1,2,4,5,6,7],4:"lambda :print('a')"}
    c = dumps(dic,False)
    print(c)
    
if __name__ == '__main__':
    main()
匯出結果<pre name="code" class="python">
{
    "a":1,
    1:"2",
    2:{
        1:1,
        2:2,
    },
    3:[
        1,
        2,
        4,
        5,
        6,
        7,
    ],
    4:lambda :print('a'),
}