当一个文件夹下面有很多小文件时,会导致打开文件夹的速度变慢,这时需要新建一些子文件夹,将小文件重新归类。
1. os.listdir 和 filter
在python中,通过os.listdir
读取文件夹下的文件名,如果我们只希望对某种特别的文件类型进行重新归类,则可以通过filter
来筛选读取到的文件。
filter
的语法规则为
filter(function, iterable)
其功能类似于
def filter(function,iterable):
newList = []
for i in iterable:
if function(i):
newList.append(i)
return newList
所以,对于一个文件名而言,我们可以通过判定其末位的扩展名,来实现对特定文件的筛选。但需要注意的是,filter
返回的并不是list
,我们可以将其转换成list
,从而方便后续的处理。
# 建立一个筛选规则
formFilter = lambda form :\
lambda f : True if f[-len(form):] == form else False
# 输入文件夹,返回文件夹下所有dType类型数据
getAllFiles = lambda path,dType : \
list(filter(formFilter(dType),os.listdir(path))) #筛选文件
2. 新建文件夹与剪切文件
在python中,可通过os.mkdir
来新建一个文件夹,通过os.path.exists
来判定某个文件夹是否存在。所以,当我们希望将某个文件存储到某个文件夹中的时候,可以先进行判定。
# 新建文件夹
def mkDir(path):
if not os.path.exists(path):
os.mkdir(path)mkDir
在Python中,os.rename
是对文件重新命名的函数,然而在windows中,会自动将\
识别为文件夹的层级关系。所以,如果我们希望将名为"test.txt"
的文件移动到名为"folder"
的文件夹中,则只需要将其文件名改为"folder\test.txt"
即可,但前提是文件及"folder"
必须存在。
其调用格式为
os.rename(src,dst)
其中,src
为源文件,dst
为目标文件。
3. 实现
我们希望将文件夹中名为a-b.txt
的文件重新命名为b.txt
,并存储在文件夹a
中。
import os
# 文件夹筛选器
formFilter = lambda form :\
lambda f : True if f[-len(form):] == form else False
# 只对文件名称中有mark的进行操作
markFilter = lambda mark:\
lambda f : True if mark in f else False
# 输入文件夹,返回文件夹下所有dType类型数据
getAllFiles = lambda path,dType : \
list(filter(formFilter(dType),os.listdir(path))) #筛选文件
# 新建文件夹
def mkDir(path):
if not os.path.exists(path):
os.mkdir(path)
def splitFolder(path=r'E:\Downloads\Cloud\Jtxt',mark="-"):
if path[-1]!='\\':
path += "\\"
files = getAllFiles(path,"txt")
files = list(filter(markFilter(mark),files))
for f in files:
try:
folder = f.split(mark)[0]
newName = f[len(folder)+1:]
mkDir(path+folder)
os.rename(path+f,path+folder+'\\'+newName)
except:
print(f)
if __name__ == "__main__":
splitFolder()