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

  • A+
所属分类:python基础入门

文件批量重命名正则替换添加序号删除后缀合并目录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
我的微信公众号
爱真理,得永生!          爱在灵灵久博客,网罗天下,福利大家!

发表评论

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