之前已经完成获取目录信息的基本功能,但在内容比较多的目录下运行结果如图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格式字符串部分说明: