文件批量重命名正则替换添加序号删除后缀合并目录python3脚本工具

  • A+
所属分类:未分类

文件批量重命名正则替换添加序号删除后缀合并目录python3脚本工具

[常用选项] 
a. 从文件名中批量删除或替代某段文字。
b. 在文件名前头批量增加相同文字。
d. 在文件名后头批量增加相同文字(文件名不包括扩展名)。

[其他多级子目录下多文件处理]
c. 在文件名前头增加各级目录名(从刚刚输入目录开始)。
f. 把当前目录下面各级子目录的所有子文件,合并到当前目录。
j. 把当前目录下面各级目录中所有<非图片文件>,合并到新建'not_img'目录中。

[其他当前目录下的多文件处理] 
g. 批量删除文件<扩展名>。
e. 按<文件创建时间>顺序,用数字为名(0, 1, 2...)批量修改文件名。
   (LINUX系统中是按最后修改时间, 文件扩展名不受影响)
h. 按文件名<开头相同>文字进行分类,并设置目录保存。
i. 根据文件名中的<相同关键词>进行分类,并设置目录保存。
l. 根据<正则式>,对文件名进行分类,并设置目录保存。
k. 当前目录下文件数量太多,缓存量大影响读取速度时,按<数量>分类保存。

转载python源码:

  1. #?!/usr/bin/env?python
  2. #?-*-?coding:?utf-8?-*-
  3. import?os
  4. from?PIL?import?Image
  5. import?re
  6. def?isimg(filepath):
  7. ????valid?=?True
  8. ????try:
  9. ????????Image.open(filepath).verify()
  10. ????except:
  11. ????????valid?=?False
  12. ????return?valid
  13. def?process_a(path,?text,?text2,?option2):
  14. ????"""从文件名中批量删除或替代某段文字。?"""
  15. ????if?option2?==?'y':
  16. ????????for?i?in?os.walk(path):
  17. ????????????for?j?in?i[2]:
  18. ????????????????old_path?=?os.path.join(i[0],?j)
  19. ????????????????new_path?=?os.path.join(i[0],?j.replace(text,?text2))
  20. ????????????????if?not?new_path:
  21. ????????????????????continue
  22. ????????????????os.rename(old_path,?new_path)
  23. ????elif?option2?==?'n':
  24. ????????for?i?in?os.listdir(path):
  25. ????????????old_path?=?os.path.join(path,?i)
  26. ????????????#?如只限文件,?可以对?old_path?进行?os.path.isfile()?判断
  27. ????????????new_path?=?os.path.join(path,?i.replace(text,?text2))
  28. ????????????if?not?new_path:
  29. ????????????????continue
  30. ????????????os.rename(old_path,?new_path)
  31. ????print(">?完成任务。")
  32. def?process_b(path,?text,?option2):
  33. ????"""在文件名前头批量增加相同文字。?"""
  34. ????if?option2?==?'y':
  35. ????????for?i?in?os.walk(path):
  36. ????????????for?j?in?i[2]:
  37. ????????????????old_path?=?os.path.join(i[0],?j)
  38. ????????????????new_path?=?os.path.join(i[0],?text+j)
  39. ????????????????os.rename(old_path,?new_path)
  40. ????elif?option2?==?'n':
  41. ????????i?=?os.walk(path).__next__()
  42. ????????for?j?in?i[2]:
  43. ????????????old_path?=?os.path.join(i[0],?j)
  44. ????????????new_path?=?os.path.join(i[0],?text+j)
  45. ????????????os.rename(old_path,?new_path)
  46. ????print(">?完成任务。")
  47. def?process_c(path):
  48. ????"""在文件名前头增加各级目录名(从刚刚输入目录开始)。?"""
  49. ????option2?=?input(">?是否包括子文件夹下的所有文件,选项(y/n):"
  50. ????????????????????"??输入'q'返回。?\n$?")
  51. ????if?option2?in?['q',?'Q']:
  52. ????????return?menu2(path)
  53. ????if?option2?==?'y':
  54. ????????for?i?in?os.walk(path):
  55. ????????????for?j?in?i[2]:
  56. ????????????????#?i[0]?目录名,?j?目录下的文件名
  57. ????????????????old_path?=?os.path.join(i[0],?j)
  58. ????????????????#?path?目录的相对目录名
  59. ????????????????path_short?=?path.strip().split(os.sep)[-1]
  60. ????????????????text?=?(path_short?+?i[0].replace(path,?'')).replace(os.sep,?'.')?+?'.'
  61. ????????????????new_path?=?os.path.join(i[0],?text+j)
  62. ????????????????os.rename(old_path,?new_path)
  63. ????elif?option2?==?'n':
  64. ????????i?=?os.walk(path).__next__()
  65. ????????for?j?in?i[2]:
  66. ????????????#?i[0]?目录名,?j?目录下的文件名
  67. ????????????old_path?=?os.path.join(i[0],?j)
  68. ????????????text?=?path?+?'.'
  69. ????????????new_path?=?os.path.join(i[0],?text?+?j)
  70. ????????????os.rename(old_path,?new_path)
  71. ????print(">?完成任务。")
  72. def?process_d(path,?text,?option2):
  73. ????"""在文件名后头批量增加相同文字(不影响文件扩展名)。?"""
  74. ????if?option2?==?'y':
  75. ????????for?i?in?os.walk(path):
  76. ????????????for?j?in?i[2]:
  77. ????????????????old_path?=?os.path.join(i[0],?j)
  78. ????????????????fname,?fextension?=?os.path.splitext(j)
  79. ????????????????new_path?=?os.path.join(i[0],?fname+text+fextension)
  80. ????????????????os.rename(old_path,?new_path)
  81. ????elif?option2?==?'n':
  82. ????????i?=?os.walk(path).__next__()
  83. ????????for?j?in?i[2]:
  84. ????????????old_path?=?os.path.join(i[0],?j)
  85. ????????????fname,?fextension?=?os.path.splitext(j)
  86. ????????????new_path?=?os.path.join(i[0],?fname?+?text?+?fextension)
  87. ????????????os.rename(old_path,?new_path)
  88. ????print(">?完成任务。")
  89. def?process_e(path):
  90. ????"""按文件创造时间顺序(LINUX系统中是按最后修改时间),用数字为名(0,?1,?2...)批量修改文件名(不影响文件扩展名)。"""
  91. ????file_ctime_dict?=?{}
  92. ????for?i?in?os.listdir(path):
  93. ????????sub_path?=?os.path.join(path,?i)
  94. ????????if?os.path.isfile(sub_path):
  95. ????????????created_time?=?os.path.getctime(sub_path)
  96. ????????????file_ctime_dict[sub_path]?=?created_time
  97. ????num?=?1
  98. ????for?j?in?sorted(file_ctime_dict.items(),?key=lambda?t:?t[1]):
  99. ????????os.rename(j[0],?os.path.join(path,?str(num)+'.'+j[0].split('.')[-1]))
  100. ????????num?=?num?+?1
  101. ????print(">?完成任务。")
  102. def?process_f(path):
  103. ????"""把当前目录下面各级目录的所有子文件,合并到当前目录。"""
  104. ????for?i?in?os.walk(path):
  105. ????????for?j?in?i[2]:
  106. ????????????old_path?=?os.path.join(i[0],?j)
  107. ????????????new_path?=?os.path.join(path,?j)
  108. ????????????os.rename(old_path,?new_path)
  109. ????print(">?完成任务。")
  110. def?process_g(path):
  111. ????"""批量删除文件扩展名。"""
  112. ????for?i?in?os.listdir(path):
  113. ????????sub_path?=?os.path.join(path,?i)
  114. ????????if?os.path.isfile(sub_path):
  115. ????????????newname,?fextension?=?os.path.splitext(sub_path)
  116. ????????????os.rename(sub_path,?newname)
  117. ????print(">?完成任务。")
  118. def?process_h(path):
  119. ????"""对某个文件夹下的所有文件,以文件名开头相同文字的长度进行分类,设置目录保存"""
  120. ????str_num?=?input('>?判断基准是所文件名中相同文字的数量,请回复数量:?'
  121. ????????????????????'??输入"q"返回。?\n$?')
  122. ????if?str_num?in?['q',?'Q']:
  123. ????????return?menu2(path)
  124. ????try:
  125. ????????num?=?int(str_num)
  126. ????????assert?num?>?0
  127. ????except:
  128. ????????print('>?输入内容出错,请输入数字正整数。')
  129. ????????process_h(path)
  130. ????else:
  131. ????????#?快速直接新建文件夹并?rename
  132. ????????i?=?os.walk(path).__next__()
  133. ????????for?j?in?i[2]:
  134. ????????????old_path?=?os.path.join(i[0],?j)
  135. ????????????new_dir?=?j[:num]?if?len(j)?>?num?else?j
  136. ????????????new_path?=?os.path.join(i[0],?new_dir,?j)
  137. ????????????os.renames(old_path,?new_path)
  138. ????????print(">?完成任务。")
  139. def?process_i(path):
  140. ????"""对某个文件夹下的所有文件,根据文件名中的关键词进行分类,设置目录保存。"""
  141. ????text?=?input('>?请输入关键词(也就是文件夹名,多个关键词以斜杠"/"划分):?\n'
  142. ?????????????????'??例如:?北京/天津/重庆/上海/四川?成都/马云?\n'
  143. ?????????????????'??文件名中未包含关键词,将不会被分类。?\n'
  144. ?????????????????'??输入"q"返回。?\n$?')
  145. ????if?text?in?['q',?'Q']:
  146. ????????return?menu2(path)
  147. ????if?not?text:
  148. ????????print('>?输入内容出错,请输入正确规格的关键词。')
  149. ????????process_i(path)
  150. ????else:
  151. ????????tag_list?=?text.split('/')
  152. ????????#?快速直接新建文件夹并?rename
  153. ????????i?=?os.walk(path).__next__()
  154. ????????for?j?in?i[2]:
  155. ????????????old_path?=?os.path.join(i[0],?j)
  156. ????????????for?tag?in?tag_list:
  157. ????????????????if?tag?in?j:
  158. ????????????????????new_path?=?os.path.join(i[0],?tag,?j)
  159. ????????????????????os.renames(old_path,?new_path)
  160. ????????print(">?完成任务。")
  161. def?process_j(path):
  162. ????"""把当前目录下面各级目录中所有非图片文件,合并到新建"not_img"目录中。"""
  163. ????for?i?in?os.walk(path):
  164. ????????for?j?in?i[2]:
  165. ????????????old_path?=?os.path.join(i[0],?j)
  166. ????????????if?not?isimg(old_path):
  167. ????????????????new_path?=?os.path.join(path,?'not_img',?j)
  168. ????????????????os.renames(old_path,?new_path)
  169. ????print(">?完成任务。")
  170. def?process_k(path):
  171. ????"""某个目录下,文件数量太多,缓存量大影响读取速度时,按一定数量,分类保存。"""
  172. ????str_num?=?input('>?请回复每个文件夹下的文件数量(,输入"q"返回):?\n$?')
  173. ????if?str_num?in?['q',?'Q']:
  174. ????????return?menu2(path)
  175. ????try:
  176. ????????num?=?int(str_num)
  177. ????????assert?num?>?0
  178. ????except:
  179. ????????print('>?输入内容出错,请输入数字正整数。')
  180. ????????process_k(path)
  181. ????else:
  182. ????????#?num:?每个目录下的文件数,?temp_num:?临时数;?dir_num?目录名(数字表示),第一个?0
  183. ????????temp_num?=?0
  184. ????????dir_num?=?0
  185. ????????i?=?os.walk(path).__next__()
  186. ????????for?j?in?i[2]:
  187. ????????????if?temp_num?==?num:
  188. ????????????????temp_num?=?0??#?初始化?temp_num
  189. ????????????????dir_num?+=?num??#?修改?num?个文件路径后,?新建目录名
  190. ????????????old_path?=?os.path.join(i[0],?j)
  191. ????????????new_path?=?os.path.join(i[0],?str(dir_num),?j)
  192. ????????????os.renames(old_path,?new_path)
  193. ????????????temp_num?+=?1
  194. ????????print(">?完成任务。")
  195. def?process_l(path):
  196. ????"""根据<正则式>,对文件名进行分类,并设置目录保存。"""
  197. ????pattern_str?=?input('>?请输入一段正则式,如想对下列文件按音乐类型分类:\n'
  198. ????????????????????????'??文件:"1.摇滚-崔健-红旗下的蛋.mp3",?"2.爵士-王若琳-偿还.mp3",?\n'
  199. ????????????????????????'???????"3.rap-海尔-black?cab.mp3",?"4.摇滚-谢天笑-向阳花.mp3",?\n'
  200. ????????????????????????'???????"5.民谣-赵照-一树桃花开.mp3",?"6.民谣-赵照-当你老了.mp3"??\n'
  201. ????????????????????????'??正则式输入:?r"^\\d+\\.(.+?)-.*"??\n\n'
  202. ????????????????????????'??如正则式匹配,则按第一组(第一个括号内)的匹配内容为分类后的文件夹名。\n'
  203. ????????????????????????'??如无括号,则按正则式所匹配的全部内容为分类后的文件夹名。\n'
  204. ????????????????????????'??如文件名不匹配正则式,将不会被分类。\n'
  205. ????????????????????????'??输入"q"返回。?\n$?')
  206. ????if?pattern_str?in?['q',?'Q']:
  207. ????????return?menu2(path)
  208. ????try:
  209. ????????pattern?=?eval(pattern_str)
  210. ????except:
  211. ????????print(">?输入内容出错,请输入包括引号的正确正则式样式。")
  212. ????else:
  213. ????????i?=?os.walk(path).__next__()
  214. ????????for?j?in?i[2]:
  215. ????????????match_result?=?re.search(pattern,?j)
  216. ????????????if?match_result:
  217. ????????????????#?如括号分组,按括号内匹配的内容为新建文件夹名。
  218. ????????????????try:
  219. ????????????????????dir_name?=?match_result.group(1)
  220. ????????????????except:
  221. ????????????????????dir_name?=?match_result.group(0)
  222. ????????????????old_path?=?os.path.join(i[0],?j)
  223. ????????????????new_path?=?os.path.join(i[0],?dir_name,?j)
  224. ????????????????os.renames(old_path,?new_path)
  225. ????????print(">?完成任务。")
  226. def?menu3_1(path,?option):
  227. ????"""第三级菜单,?直接影响结果为?a,?b,?d"""
  228. ????text?=?input(">?请输入需要修改文字,输入'q'返回上级选项:?\n$?")
  229. ????if?option?==?"a":
  230. ????????text2?=?input(">?请输入替代后的文字;直接敲回车键(Enter)删除文字:?\n$?")
  231. ????if?text?in?["q",?"Q"]:
  232. ????????menu2(path)
  233. ????elif?text:
  234. ????????while?1:
  235. ????????????option2?=?input(">?是否包括子文件夹下的所有文件,选项(y/n):")
  236. ????????????if?option2?in?['y',?'n',?'Y',?'N']:
  237. ????????????????if?option?==?'a':
  238. ????????????????????return?process_a(path,?text,?text2,?option2.lower())
  239. ????????????????elif?option?==?'b':
  240. ????????????????????return?process_b(path,?text,?option2.lower())
  241. ????????????????elif?option?==?'d':
  242. ????????????????????return?process_d(path,?text,?option2.lower())
  243. ????????????else:
  244. ????????????????print('>?输入的选项有误,?请重新输入。')
  245. ????else:
  246. ????????print(">?未输入文字,请重新输入。")
  247. ????????menu3_1(path,?option)
  248. def?menu2(path):
  249. ????"""第二级菜单,?直接影响结果为?c,?e,?f,?g"""
  250. ????option?=?input(">?请选择批量修改选项(回复字母):\n"
  251. ???????????????????"??\n"
  252. ???????????????????"??[常用选项]?\n"
  253. ???????????????????"??a.?从文件名中批量删除或替代某段文字。\n"
  254. ???????????????????"??b.?在文件名前头批量增加相同文字。\n"
  255. ???????????????????"??d.?在文件名后头批量增加相同文字(文件名不包括扩展名)。\n"
  256. ???????????????????"??\n"
  257. ???????????????????"??[其他多级子目录下多文件处理]?\n"
  258. ???????????????????"??c.?在文件名前头增加各级目录名(从刚刚输入目录开始)。\n"
  259. ???????????????????"??f.?把当前目录下面各级子目录的所有子文件,合并到当前目录。\n"
  260. ???????????????????"??j.?把当前目录下面各级目录中所有<非图片文件>,合并到新建'not_img'目录中。\n"
  261. ???????????????????"??\n"
  262. ???????????????????"??[其他当前目录下的多文件处理]?\n"
  263. ???????????????????"??g.?批量删除文件<扩展名>。\n"
  264. ???????????????????"??e.?按<文件创建时间>顺序,用数字为名(0,?1,?2...)批量修改文件名。\n"
  265. ???????????????????"?????(LINUX系统中是按最后修改时间,?文件扩展名不受影响)\n"
  266. ???????????????????"??h.?按文件名<开头相同>文字进行分类,并设置目录保存。\n"
  267. ???????????????????"??i.?根据文件名中的<相同关键词>进行分类,并设置目录保存。\n"
  268. ???????????????????"??l.?根据<正则式>,对文件名进行分类,并设置目录保存。\n"
  269. ???????????????????"??k.?当前目录下文件数量太多,缓存量大影响读取速度时,按<数量>分类保存。\n"
  270. ???????????????????"??\n"
  271. ???????????????????"??q.?返回到上级选项。\n$?")
  272. ????if?not?option:
  273. ????????print('>?请输入选项后,按回车。')
  274. ????????return?menu2(path)
  275. ????option?=?option.strip().lower()
  276. ????if?option?==?'q':
  277. ????????return
  278. ????elif?option?in?['a',?'b',?'d']:
  279. ????????menu3_1(path,?option)
  280. ????elif?option?==?'c':
  281. ????????process_c(path)
  282. ????elif?option?==?'e':
  283. ????????process_e(path)
  284. ????elif?option?==?'f':
  285. ????????process_f(path)
  286. ????elif?option?==?'g':
  287. ????????process_g(path)
  288. ????elif?option?==?'h':
  289. ????????process_h(path)
  290. ????elif?option?==?'i':
  291. ????????process_i(path)
  292. ????elif?option?==?'j':
  293. ????????process_j(path)
  294. ????elif?option?==?'k':
  295. ????????process_k(path)
  296. ????elif?option?==?'l':
  297. ????????process_l(path)
  298. ????else:
  299. ????????print('>?您输入的选项有误,请重新输入。')
  300. ????????menu2(path)
  301. def?menu1():
  302. ????"""主菜单"""
  303. ????print("【批量文件重命名&移动脚本】\n"
  304. ??????????"?用途:?可以轻松对文件夹下的各级子目录文件进行重命名等操作。\n"
  305. ??????????"?作者:?guzdy\n"
  306. ??????????"?邮箱:?guz.jin@gmail.com\n")
  307. ????while?1:
  308. ????????path?=?input(">?请输入需要批量修改名字的文件夹路径,输入'q'退出:?\n$?")
  309. ????????if?path?in?["q",?"Q"]:
  310. ????????????print('>?MultiRename?退出程序。')
  311. ????????????return
  312. ????????elif?os.path.isdir(path):
  313. ????????????path?=?os.path.abspath(path)
  314. ????????????menu2(path)
  315. ????????else:
  316. ????????????print('>?您输入的文件夹路径有误,请重新输入。')
  317. if?__name__?==?"__main__":
  318. ????menu1()
  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: