问题实例:
B站视频:《李子璇豆子舞蹈合集(持更)》
链接:https://www.bilibili.com/video/av27235826/?p=1
该视频截至2018.11.30有195个分P,通过缓存到手机上并把缓存目录所在的文件夹上传至PC端。利用格式工厂查找.blv格式的所以文件并转化为.MP4格式。保存于源文件。
但是B站所缓存的视频并不是集中存放于一个文件而是被分散许多小文件夹当中存放。并且所有视频的名称都是0。如以下几图所示,P1视频被存放于.\1\lua.flv720.bili2api.64\0.MP4 目录下。对于大批量的文件来说,手动给每个MP4文件更改文件名,是不现实的。因此决定用Python编写简单脚本完成对大量0.MP4文件的集中存储与重命名。
分析:
重命名:
从B站爬取该视频下每个分P的标题,并存储为txt文档。如下图:txt中每一行对应于一个P的标题。txt存放位置:C:\Users\DELL\Desktop\title.txt
视频源文件位置:G:\download\27235826\n\lua.flv720.bili2api.64\0.mp4
其中n=1 to 195 的整数
视频目的地址:G:\1\27235826
伪代码:
读取txt文件的每行,存放在列表list
for 遍历源文件找到视频文件 i:
将 i 复制到目的地址下
从list中找出相应的标题title
重命名 i–>title
代码如下:
import os #载入os库
import shutil #载入shutil库
#获取分p标题列表
def getNewName():
name=[]
path='C:\\Users\\DELL\\Desktop\\title.txt' #titile.txt地址
for line in open(path): #读取txt文件的每一行
line=line.replace("/"," ") #去掉line中的斜杠
name.append(line.strip()) #记录于标题列表
return name
#获取源视频路径列表
def getOldVideoPath():
oldpath=[]
for i in range(1,196):
path='G:\\download\\27235826\\'+str(i) #视频地址
for dirpath, dirnames, filenames in os.walk(path): #遍历视频地址下所有文件
if "0.mp4" in filenames: #若该文件下有0.MP4文件存在,则记录下来
videopath=dirpath+"\\0.mp4"
oldpath.append(videopath)
return oldpath #返回源视频路径列表
#主函数
def main():
name=getNewName()
oldpath=getOldVideoPath()
for i in range(1,196):
try:
shutil.copy(oldpath[i-1],'G:\\1\\27235826') #复制文件到G:\1\27235826
print i,'copy ok'
newname='G:\\1\\27235826\\'+name[i-1]+'.mp4' #构建新文件名
os.rename('G:\\1\\27235826\\0.mp4',newname) #重命名
print i,'rename ok'
except:
print 'error',i
#主函数自动运行
if '__name__'!='__main()__':
main()
总结:
1.要对从TXT文档读取到的数据进行整理,去掉不符合规范的字符,比如‘/’,换行符 line.replace("/"," ") line.strip()
2.os.walk()没有返回值,用for来 获取值
for dirpath, dirnames, filenames in os.walk(path)
如果目录层级多的话可能遍历不止一次,可能会有0结果,很坑
3.shutil.copy() shutil.copyfile() shutil.move() 不一样