在学校时,从六维空间下载了一些电子书,文学类全英文mobi格式的,有24G多。放在硬盘有段时间了,比较占地方,想移到移动硬盘里去。文件的目录格式如下:
第一级目录是按作者名排序的文件夹,第二级目录是以书的名字命名的文件夹,第三级就是书了。
讲道理的话我直接剪切,粘贴就结束了,可是,偏偏就出问题了,粘贴的时候提示我文件名太长,不能粘贴。然后就搜索了一下,Windows文件的路径最长为255字符,这里由于书名和第二级文件夹目录名字较长,超过了限制,导致无法复制过去。
所以才有了这篇文章。
计划是把第二级文件夹的名字缩短,这样以后搜索书名的时候还可以检索到相应的书目。
下面直接上代码了,代码写的很糙,看下思路就行了。
import os
dir = os.getcwd() #获取当前目录
subdir = os.listdir(dir) #遍历当前目录下所有文件,也就是获取第一级作者名字所有文件夹
for i in subdir:
path = os.path.join(dir,i) #把第一级目录添加到路径中
if os.path.isdir(path): #如果path仍然是文件夹,下面就继续遍历出其中的文件,
end_dir = os.listdir(path) #实际上这步判断可以不要的,因为我知道目录结构。
for i in range(len(end_dir)): #一些作者下面可能会有多本书,所以再一次遍历得到二级文件夹目录
newname = end_dir[i][0:50] #这里缩短二级文件夹的名字,取前50个字符。
os.rename(os.path.join(path,end_dir[i]),os.path.join(path,newname)) #用新名字取代旧名字
到这里,名字就改完了,我顺利的把文件移到了硬盘。
然后呢,我在想,24G,有多少本书呢,那么问题来了,
代码很糙,凑合看吧,上代码。这段代码是通用的,可以直接放到任何地方检查文件数。
import os
result = []
def get_all(cwd):
get_dir = os.listdir(cwd) #遍历当前目录,获取文件列表
for i in get_dir:
sub_dir = os.path.join(cwd,i) # 把第一步获取的文件加入路径
if os.path.isdir(sub_dir): #如果当前仍然是文件夹,递归调用
get_all(sub_dir)
else:
ax = os.path.basename(sub_dir) #如果当前路径不是文件夹,则把文件名放入列表
result.append(ax)
print(len(result)) #对列表计数
if __name__ == "__main__":
cur_path = os.getcwd() #当前目录
get_all(cur_path)
最后,运行后得到结果15108,然后可以结合上篇文章,把书名导入到Excel表中,方便查询。