文件及文件夹的重命名
写在前面
这也不算是很地道的用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)
方法,程序的思路很清晰,程序流程图如下:
这里显示不了mermaid
的流程图,个人感觉这款编写流程图的语言还挺好用的,以下是流程图:
特别想要提到的是,最后判断如果是文件夹的话,就需要进入文件夹内,对文件夹内的子文件夹及文件进行相同的操作,因此,采用了递归 的形式,函数可以调用自身,如此往复循环,即可将根目录下的所有文件及文件夹都进行遍历及重命名。
这段代码存在不严谨的地方,应该需要判断名称中是否含有空格,之后再进行操作。
偶然的发现
对于第一步生成一系列的文件夹来说,生成是很容易的,但突然发现删除却带来了困扰。我尝试了一下,假如将把判断的条件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
的文件操作,我后续也会更新出比较详细的文档。