-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmyproperties.py
executable file
·150 lines (122 loc) · 4.27 KB
/
myproperties.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#!/usr/bin/env python3
import os
import sys
import time
import collections
import tkinter as tk
# version 0.2.0 : avoid filetype is type
# version 0.3.0 : add fsize for each type of files
# version 0.4.0 : correctly deal with the hidden file
# version 0.5.0 : add option to show preferred items
USAGE = """
myproperties.py [path] : show detail properties for file/dir
"""
if '-h' in sys.argv or '--help' in sys.argv:
print(USAGE)
sys.exit(0)
cwp = sys.argv[1] if len(sys.argv) > 1 else os.path.expanduser('~')
seplist = []
if not (os.path.isfile(cwp) or os.path.isdir(cwp)):
print('Fatal: currently only file and dir are supproted')
sys.exit(0)
def bytes2human(size):
unit = 1024
# order is important
if size > 1000*unit*unit: # 1000 MB
size = size / unit / unit / unit
hsize = '{:.3f} GB'.format(size)
elif size > 1000*unit: # 1000 KB
size = size / unit / unit
hsize = '{:.3f} MB'.format(size)
elif size > 1000:
size = size / unit
hsize = '{:.3f} KB'.format(size)
else:
hsize = '{:.3f} Bytes'.format(size)
return hsize
data = collections.OrderedDict()
data['@current_work_path'] = os.path.abspath(os.path.split(cwp)[0])
data['@name'] = os.path.basename(cwp)
if os.path.isdir(cwp):
data['@type'] = 'dir'
elif os.path.isfile(cwp):
data['@type'] = 'file'
else:
data['@type'] = 'unknown'
data['@modified_time'] = time.ctime(os.path.getmtime(cwp))
data['=*='] = '' # work as separator
seplist.append('=*=')
# specifically deal with file
if os.path.isfile(cwp):
data['file_size'] = os.path.getsize(cwp)
else:
data['view_file_num'] = 0
data['view_file_total_size'] = 0.0
data['view_dir_num'] = 0
data['hidden_file_num'] = 0
data['hidden_file_total_size'] = 0.0
data['hidden_dir_num'] = 0
data['unknown_file_num'] = 0
data['unknown_file_total_size'] = 0.0
adddict = {}
for (dirpath, dirnames, filenames) in os.walk(cwp):
dbase = os.path.basename(dirpath) # care when ./.good
if dbase.startswith('.'):
data['hidden_dir_num'] += 1
bo_hidden = True
else:
data['view_dir_num'] += 1
bo_hidden = False
for f in filenames:
file = os.path.join(dirpath,f)
if not os.path.isfile(file): continue # os.walk does not follow symlink
base,ext = os.path.splitext(f)
fsize = os.path.getsize(file)
if ext:
pext = ext[1:].lower()
if pext in adddict:
adddict[pext][0] += 1
adddict[pext][1] += fsize
else:
adddict[pext] = [1,fsize]
else:
data['unknown_file_num'] += 1
data['unknown_file_total_size'] += fsize
if bo_hidden or base.startswith('.'):
data['hidden_file_num'] += 1
data['hidden_file_total_size'] += fsize
else:
data['view_file_num'] += 1
data['view_file_total_size'] += fsize
data['total_dir_num'] = data['view_dir_num'] + data['hidden_dir_num']
data['total_file_num'] = data['view_file_num'] + data['hidden_file_num']
data['total_file_size'] = data['view_file_total_size'] + data['hidden_file_total_size']
for k,v in data.items():
if 'size' in k:
data[k] = bytes2human(v)
data['=&='] = ''
seplist.append('=&=')
# my preferred keys
keyspreferred = ['drawio','doc','docx','html','pdf']
ckeys = [i for i in keyspreferred if i in adddict]
skeys = sorted(adddict.keys())
for i in ckeys: skeys.remove(i)
for k in ckeys+skeys:
s = bytes2human(adddict[k][1])
data[k] = '{:} ({:})'.format(adddict[k][0],s)
g_width = 800
g_height = 600
root = tk.Tk()
root.geometry('{:}x{:}'.format(g_width,g_height))
root.title('XZProperties')
scrollbar = tk.Scrollbar(root)
scrollbar.pack(side='right', fill='y')
mylist = tk.Listbox(root, yscrollcommand=scrollbar.set, font=('courier',12))
for k,v in data.items():
if k in seplist:
info = '='*30
else:
info = ' {:30}: {:}'.format(k,v)
mylist.insert(tk.END, info)
mylist.pack(side='left', fill='both', expand=True)
root.mainloop()