欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

文件及文件夹的重命名-- python实现

程序员文章站 2022-07-13 15:40:05
...

文件及文件夹的重命名

写在前面

这也不算是很地道的用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) 方法,程序的思路很清晰,程序流程图如下:

graph TD
    A(获取当前目录路径) --> B(遍历当前目录下所有文件及文件夹)
    B --> C(重命名遍历的成员)
    C --> D{是否为文件夹}
    D --> ||A
    D --> |不是|E(结束)
    style A fill:#ecf, stroke:#ccf, stroke-width:1px;
    style B fill:#ecf, stroke:#ccf, stroke-width:1px;
    style C fill:#ecf, stroke:#ccf, stroke-width:1px;
    style D fill:#ecf, stroke:#ccf, stroke-width:1px;
    style E fill:#ccf, stroke:#ecf, stroke-width:1px;

这里显示不了mermaid 的流程图,个人感觉这款编写流程图的语言还挺好用的,以下是流程图:
文件及文件夹的重命名-- python实现

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

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

偶然的发现

对于第一步生成一系列的文件夹来说,生成是很容易的,但突然发现删除却带来了困扰。我尝试了一下,假如将把判断的条件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 的文件操作,我后续也会更新出比较详细的文档。