文件及文件夹的重命名


文章目录

  • 文件及文件夹的重命名
  • 写在前面
  • 主要操作步骤
  • Show me the code
  • First of all
  • Secondly
  • 偶然的发现
  • 写在后面


写在前面

这也不算是很地道的用python 来进行文件操作,只是用到了简单的创建,修改,删除等操作。可能是因为我现在用到的比较少,所以对整个文件操作的了解还比较少,后期我会补充一些文件操作的知识。

写这几个程序的缘由,还是因为我的树莓派raspberry ,因为我在树莓派上听音乐的时候,使用的是Omxplayer ,先不管这个播放器,如果有意向,点这里树莓派的硬件解码播放神器——Omxplayer 。有幸有一系列的音乐文件,本来想降其拷贝到树莓派里面,开启在使用树莓派的同时,也能美美的听着歌。但是无奈,很多歌曲的文件名称结构为:歌曲名 歌手名.mp3 ,请注意看,中间那个是空格啊!

对的,在使用omxplayer 的时候发现其对于有空格的文件名,识别不了,那么这就很尴尬了,眼看就能美美的听着歌了,关键时刻还是Python 显个神通来帮忙。

主要操作步骤

很显然,需要的python 脚本实现将文件夹下的歌曲文件名称中的空格都去掉,空格都去掉会显得特别难看,比如说白鳥英美子 - NORWEGIAN WOOD.mp3 就会变成白鳥英美子-NORWEGIANWOOD.mp3 这样看上去,是不是很无语。特别是好几百首歌全是这样子的紧凑在一起的名字。所以最后,我的操作是将空格替换成下划线,自我感觉稍微顺眼了一下。

首先要了解,文件结构是什么样子的,举例如下:

|__我 是 根 目 录
|	|__ 我 是 子 目 录 1
|		|__ 我 是 子 子 目 录 1
|		|__ 我 是 子 子 目 录 2
|		|__ 我 是 子 文 件 1
|		|—— 我 是 子 文 件 2
|	|__ 我 是 子 目 录 2
|		|__ 我 是 子 子 目 录 1
|		|__ 我 是 子 子 目 录 2
|		|__ 我 是 子 文 件 1
|		|—— 我 是 子 文 件 2
|	|__ 我是子文件1
|	|__ 我是子文件1

以上文件结构我只列举了两层,而实际上是有很多层的。

Show me the code

First of all

首先,做这个测试一开始并不能拿我们真实的音乐文件来做试验啊,得先准备个假的试验对象,于是就有了如下这段代码:

#! /bin/usr/python3
# _*_coding:utf-8_*_

import sys
import os

def cur_file_dir():
    # 获取当前文件路径
    path = sys.path[0]
    if os.path.isdir(path):
        return path
    elif os.path.isfile(path):
        return os.path.dirname(path)

def open_lot(path):
    for i in range(0,3):     
        # print(i)
        file_name = "这 个 文 档 {}".format(i)
        file_path = os.path.join(path,file_name)
        # print ("file_path",file_path)
        if os.path.exists(file_path):
            pass
        else:
            fo = open(file_path,"wt")
            fo.close()
           
def mkdir_lot(path): 
    for i in range(0,3):
        # print(i)
        dir_name = "这 个 目 录 {}".format(i)
        dir_path = os.path.join(path,dir_name)
        # print ("dir_path",dir_path)
        # print ("len(dir_path):",len(dir_path))
        if os.path.exists(dir_path):
            open_lot(dir_path)      
        else:
            os.mkdir(dir_path)
            open_lot(dir_path)
            if len(dir_path) < 40:	# 通过修改路径的长度,来改变路径的深度
                mkdir_lot(dir_path)	# 这里是递归
            else:
                pass

if __name__ == "__main__":        
    path = cur_file_dir()
    # print(path)
    mkdir_lot(path)

这段代码是负责生成我们想要测试的文件结构对象,直接运行效果如下:

├─这 个 目 录 0
│  ├─这 个 目 录 0
│  ├─这 个 文 档 0.txt
│  ├─这 个 文 档 1.txt
│  └─这 个 文 档 2.txt
│  ├─这 个 目 录 1
│  ├─这 个 文 档 0.txt
│  ├─这 个 文 档 1.txt
│  └─这 个 文 档 2.txt
│  ├─这 个 目 录 2
│  ├─这 个 文 档 0.txt
│  ├─这 个 文 档 1.txt
│  └─这 个 文 档 2.txt
├─这 个 目 录 1
│  ├─这 个 目 录 0
│  ├─这 个 文 档 0.txt
│  ├─这 个 文 档 1.txt
│  └─这 个 文 档 2.txt
│  ├─这 个 目 录 1
│  ├─这 个 文 档 0.txt
│  ├─这 个 文 档 1.txt
│  └─这 个 文 档 2.txt
│  └─这 个 目 录 2
│  ├─这 个 文 档 0.txt
│  ├─这 个 文 档 1.txt
│  └─这 个 文 档 2.txt
└─这 个 目 录 2
    ├─这 个 目 录 0
    │  ├─这 个 文 档 0.txt
    │  ├─这 个 文 档 1.txt
    │  └─这 个 文 档 2.txt
    ├─这 个 目 录 1
    │  ├─这 个 文 档 0.txt
    │  ├─这 个 文 档 1.txt
    │  └─这 个 文 档 2.txt
    └─这 个 目 录 2
       ├─这 个 文 档 0.txt
       ├─这 个 文 档 1.txt
       └─这 个 文 档 2.txt

有了这样一套文件及文件夹的目录,我们就可以开始进行主题操作,那就是对空格进行替换,名称如果全部按照音乐的名字来,还需要加上- 等符号,这里不做举例。

Secondly

这段代码就是对目录下文件,及子目录进行重命名的操作,代码也是比较简单易懂:

#! /bin/usr/python3
# _*_coding:utf-8_*_

import sys
import os

def cur_file_dir():
    # 获取当前文件路径
    path = sys.path[0]
    if os.path.isdir(path):
        return path
    elif os.path.isfile(path):
        return os.path.dirname(path)
            
def rename(path):
    # print("当前目录:",path)
    file_list = os.listdir(path)
    # print(file_list)  
    for file in file_list:
        # print(file)         
        old_dir = os.path.join(path,file)          
        filename = os.path.splitext(file)[0]
        # print(filename)
        filetype = os.path.splitext(file)[1]
        # print(filetype)
        old_name = filename + filetype
        print("old name is:", old_name)
        new_filename = filename.replace(" ", "")	# 这里替换的是重点
        new_name = new_filename.replace("", "")		# 如果无法一次替换成功,可以进行多次替换
        print("new name is:", new_name)
        new_dir = os.path.join(path, new_name + filetype)  # 新的文件路径
        os.rename(old_dir, new_dir)  				# 重命名
        # print("DONE")     
        if os.path.isdir(new_dir):
            rename(new_dir)						# 注意这里是重点,这里使用了递归

if __name__ == "__main__": 
    rename(cur_file_dir())
    print("ALL DONE!!!")

主要操作是进行,字符串的替换操作,使用到的方法是replace("替换什么","替换成什么") ,以及文件系统操作中的os.rename(old_dir,new_dir) 方法,程序的思路很清晰,程序流程图如下:

zipfile 重命名文件 python python文件夹重命名_python

这里显示不了mermaid 的流程图,个人感觉这款编写流程图的语言还挺好用的,以下是流程图:

zipfile 重命名文件 python python文件夹重命名_python_02

特别想要提到的是,最后判断如果是文件夹的话,就需要进入文件夹内,对文件夹内的子文件夹及文件进行相同的操作,因此,采用了递归 的形式,函数可以调用自身,如此往复循环,即可将根目录下的所有文件及文件夹都进行遍历及重命名。

这段代码存在不严谨的地方,应该需要判断名称中是否含有空格,之后再进行操作。

偶然的发现

对于第一步生成一系列的文件夹来说,生成是很容易的,但突然发现删除却带来了困扰。我尝试了一下,假如将把判断的条件if len(dir_path) < 40: 修改成80 ,那么就会嵌套很多层文件夹,用windows 系统下的删除,也会删除很长时间,长到无法忍受,所以就有了下面这段:

#! /bin/usr/python3
# _*_coding:utf-8_*_

import sys
import os
import shutil

def cur_file_dir():
    # 获取当前文件路径
    path = sys.path[0]
    if os.path.isdir(path):
        return path
    elif os.path.isfile(path):
        return os.path.dirname(path)
           
def delete_lot(path):    
    file_list = os.listdir(path)
    for file in file_list:
        dir_path = os.path.join(path,file)
        # print ("dir_path",dir_path)
        if os.path.isdir(dir_path):
            shutil.rmtree(dir_path)

if __name__ == "__main__": 
	path = cur_file_dir()
	delete_lot(path)

这段代码慎用 ,如果使用不当,可能会删除目录下的所有文件夹,后果不堪设想。这里只是提供一种方式,能够将第一步生成的文件夹给顺利删除,方便测试。

写在后面

这个例子并不是我想要很详细说明的,我想要将的东西在下一篇,因为我matlab 最近用到的比较多,想要记录一下,以后后续使用的时候能及时找到。

不过关于python 的文件操作,我后续也会更新出比较详细的文档。