1 #!/usr/bin/env python
2 #coding=utf-8
3 #
4 # 版权所有 2014 yao_yu (http://blog.csdn.net/yao_yu_126)
5 # 本代码以MIT许可协议发布
6 # 文件名批量加.xls后缀
7 # 2014-04-21 创建
8 #
9
10 import os
11 import tkinter as tk
12 from tkinter import ttk
13
14
15
16 version = '2014-04-21'
17 app_title = '文件名批量加后缀 Ver:' + version
18
19 listdir = os.listdir
20 isdir = os.path.isdir
21 isfile = os.path.isfile
22 path_join = os.path.join
23
24 #---------------------------- Object Visit ----------------------------#
25 def visit_directory_files(root, visitor):
26 for i in listdir(root):
27 i = path_join(root, i)
28 if isdir(i):
29 if visit_directory_files(i, visitor):
30 return True
31 elif isfile(i):
32 if visitor(i):
33 return True
34
35 #---------------------------- Visitor ----------------------------#
36 class ListVisitor(object):
37 def __init__(self, *visitors, terminate = True):
38 if (visitors
39 and isinstance(visitors, (list, tuple))
40 and isinstance(visitors[0], (list, tuple))):
41 visitors = visitors[0]
42 self._visitors = list(visitors)
43 self._terminate = terminate
44 def __call__(self, *args, **kwdargs):
45 for visitor in self._visitors:
46 if visitor(*args, **kwdargs):
47 return self._terminate
48 def append(self, visitor):
49 assert(visitor)
50 self._visitors.append(visitor)
51
52 def get_screen_size(window):
53 return window.winfo_screenwidth(),window.winfo_screenheight()
54
55 def get_window_size(window):
56 return window.winfo_reqwidth(),window.winfo_reqheight()
57
58 def center_window(root, width, height):
59 screenwidth = root.winfo_screenwidth()
60 screenheight = root.winfo_screenheight()
61 size = '%dx%d+%d+%d' % (width, height, (screenwidth - width)/2, (screenheight - height)/2)
62 root.geometry(size)
63
64 class Application(object):
65 def __init__(self, master):
66 self.master = ttk.Frame(master)
67 self.master.pack(side = tk.TOP, expand = tk.YES, fill = tk.BOTH)
68 self.create_widgets()
69
70 def create_widgets(self):
71 master = self.master
72 master.columnconfigure(1, weight=1)
73 master.rowconfigure(2, weight=1)
74 self.targetdir = tk.StringVar()
75 self.targetdir.set('/Volumes/Data/Document/Test')
76 padx = 5
77 pady = 10
78 ttk.Label(master, text="操作目录").grid(row = 0, column = 0, stick = tk.E, padx = padx, pady = pady)
79 ttk.Entry(master, textvariable = self.targetdir).grid(row = 0, column = 1, stick = tk.EW, padx = padx)
80 commands = ttk.Frame(master)
81 commands.grid(row = 1, column = 0, columnspan = 2)
82 ttk.Button(commands, text="开始", command = self.onStart).pack(side = tk.LEFT)
83 ttk.Button(commands, text="退出", command = master.quit).pack(side = tk.LEFT)
84
85 self.status = tk.StringVar()
86 self.status.set('就绪')
87 master.rowconfigure(3, minsize = 160)
88 ttk.Label(master, textvariable = self.status, wraplength=600).grid(row = 3, column = 0, columnspan = 2, padx = padx, stick = tk.NSEW)
89 self.progress = ttk.Progressbar(master, maximum=100, orient=tk.HORIZONTAL, mode='determinate')
90 self.progress.grid(row = 4, column = 0, columnspan = 2, padx = padx, stick = tk.NSEW)
91
92 def onStart(self):
93 targetdir = self.targetdir.get().strip()
94 basename = os.path.basename(targetdir)
95 if os.path.isdir(targetdir):
96 listvisitor = ListVisitor(ProgressVisitor(self.progress),
97 self.StatusVisitor(),
98 FileLogVisitor(basename),
99 #FileRenameVisitor(basename),
100 )
101 visit_directory_files(targetdir, listvisitor)
102 else:
103 self.status.set('目标目录不存在')
104
105 def StatusVisitor(self):
106 print_status = self.status.set
107 def __call__(file):
108 __call__.n += 1
109 print_status('%s,%s' % (__call__.n, file))
110 __call__.n = 0
111 return __call__
112
113 splitext = os.path.splitext
114 file_rename = os.rename
115 knownexts = dict.fromkeys(['.jpg', '.log', '.pdf', '.tif', '.xls', '.zip', '.rar'])
116 class FileRenameVisitor(object):
117 def __init__(self, file):
118 self.__fp = open('%s_%s_rename.txt' % (os.path.splitext(__file__)[0], file), 'w')
119 def __call__(self, file):
120 ext = splitext(file)[1].lower()
121 if ext not in knownexts:
122 file_rename(file, file + '.xls')
123 self.__fp.write('%s\n' % file)
124 def __del__(self):
125 self.__fp.close()
126
127 class FileLogVisitor(object):
128 def __init__(self, file):
129 self.__fp = open('%s_%s_all.txt' % (os.path.splitext(__file__)[0], file), 'w')
130 def __call__(self, file):
131 self.__fp.write('%s\n' % file)
132 def __del__(self):
133 self.__fp.close()
134
135 class ProgressVisitor(object):
136 COUNT = 202
137 def __init__(self, progress, count=COUNT):
138 self.progress = progress
139 if count and isinstance(count, int) and count > 0:
140 self.count = count
141 else:
142 self.count = self.COUNT
143 self.n = 1
144 def __call__(self, *args, **kwdargs):
145 self.n += 1
146 if self.n == self.count:
147 self.progress.step()
148 self.progress.update()
149 self.n = 1
150 def __del__(self):
151 self.progress['value'] = 0
152
153
154 if __name__ == '__main__':
155 root = tk.Tk()
156 root.title(app_title)
157 app = Application(root)
158 center_window(root, 600, 240)
159 tk.mainloop()