1. 程式人生 > >Python隨手記(二) 獲取目錄資訊•改

Python隨手記(二) 獲取目錄資訊•改

之前已經完成獲取目錄資訊的基本功能,但在內容比較多的目錄下執行結果如圖1。一個字形容就是“亂”,效果很不好,需要改進。


圖1 原始版顯示效果

首先感覺時間格式怪怪的,而且星期之類的也沒有必要顯示,所以從這裡下手。查詢手冊(Python v3.2.3--15.3)找到兩個有用的函式,一個是time.strftime(),一個是time.localtime ()[1],分別可以格式化時間,轉換秒數為當前時間。如想讓時間按照“2012.09.13-19:40:03”格式顯示,查詢格式字串表,可知對應的格式化字串是“%Y.%m.%d-%H:%M:%S”。另外,time.ctime()轉換時間是按照標準時間轉換的,要使用本地時間需要使用另外一個函式time.localtime()。最終存入字典的語句類似

time.strftime('%Y.%m.%d-%H:%M:%S',time.localtime(tempInfo.st_ctime)))

時間格式改完之後就要調整下輸出格式,讓各項對齊並按順序排列。這裡使用的方法是固定每一項內容的字元數,從而保證每列整齊。不過在顯示檔名時有個問題,有的檔名很長,當其長度超過格式字串指定值時,print函式會按原長度顯示,忽略指定值,造成格式混亂。因此,在顯示檔名前,使用len函式檢測其長度,如果超出範圍則將多餘部分用‘…’代替。在Python中擷取字串很簡單,直接標註範圍就可以,類似[0:17]。

最後,由於字典裡的資料時無序的,需要用sorted()函式將字典排序,按照檔名的字母順序顯示記錄,這樣比較整齊。

最終程式碼如下:

importos
importtime
importstruct
 
defGetCurPathInfo():
    CurPath = os.getcwd()
    ChildrenList = os.listdir(CurPath)
    InfoDict = dict()
   
    for Name in ChildrenList:
        tempInfo = os.stat(Name)
        tempDict = dict([\
                        ('Size',tempInfo.st_size),\
                        ('CreateTime',time.strftime('%Y.%m.%d-%H:%M:%S',time.localtime(tempInfo.st_ctime))),\
                        ('ModifyTime',time.strftime('%Y.%m.%d-%H:%M:%S',time.localtime(tempInfo.st_mtime)))\
                        ])
        InfoDict[Name] = tempDict
       
    NameOrder = sorted(InfoDict.items())
   
    print('='*80)
    print('%-20s%10s KB  %19s   %19s' %('Name', 'Size', 'ModifyTime', 'CreateTime'))
    print('-'*80)
   
    for Record in NameOrder:
        if len(Record[0])>20:
            ShowName = Record[0][0:17] + '...'
        else:
            ShowName = Record[0]
       
        info = '%-20s%10.2f KB  %19s || %19s' %(ShowName,Record[1]['Size']/1024,\
                              Record[1]['ModifyTime'],Record[1]['CreateTime'])
        print(info)
 
deftest():
    GetCurPathInfo()
    input()
 
if__name__ == '__main__': test()

顯示效果如圖2:


圖2 改進版顯示效果

【附】時間轉換的簡要說明:


【附】time.strftime格式字串部分說明: