Wallpaper Engin,steam上的一个约等于正规的”开车“软件(售价大概是18元)。想当年太傻太天真,以为就是个桌面美化软件,然后被老司机喷,才了解到正确的用法。
wallpaper上的动态壁纸大多是以视频的形式存储在wallpaper的安装目录下,不过壁纸项目文件的命名都是数字命名。如果我们要通过人工手段来将里面的”学习资料“复制出来,就太浪费时间(low)了。为了广大人民群众,所以就有了这篇文章。
先放出源码,等下在逐步分析。
import os
from shutil import copy
import threading
filename = '' #填入你的wallpaper目录
save_folder = 'E:\\下载\\steam_wallpaper' #视频的保存目录
for folder_list in open(save_folder+'\\folder.txt','r'):
folder_list = eval(folder_list)
def Copy(video_name,save_folder,folder_name):
copy(video_name,save_folder)
print('复制成功:'+folder_name)
for dir_name in os.listdir(filename):
if str(dir_name) in folder_list:
pass
else:
folder_list.append(dir_name)
for folder in os.listdir(filename+'\\'+dir_name):
folder_name,folder_format = os.path.splitext(folder)
if folder_format == '.mp4':
video_name = filename + '\\' + dir_name + '\\' + folder
while True:
if len(threading.enumerate()) <= 10:
break
t = threading.Thread(target = Copy,args = (video_name,save_folder,folder_name))
t.start()
#print(video_name)
open(save_folder+'\\folder.txt','w').write(str(folder_list))
库分析
import os
from shutil import copy
import threading
我使用了os库用于寻找wallpaper壁纸文件中的视频,shutil库中的copy函数用于复制视频文件,为了提高复制效率使用了threading库。 threading库的详情我就不多逼逼了=>详情点这
视频文件判定部分
我先让你们认识一下wallpaper壁纸项目保存目录是什么鬼样。
这些数字命名的文件夹就是壁纸项目文件,可以看到我开车开的比较猛所以壁纸文件有点多,我们打开一个文件夹作为分析目标。还有为了防止重复获取已经复制过的视频文件,我们也得给搞过的文件进行标记。
for dir_name in os.listdir(filename): #获取项目文件夹名
if str(dir_name) in folder_list:
pass
else:
folder_list.append(dir_name)
for folder in os.listdir(filename+'\\'+dir_name): #进入壁纸项目获取文件名和后缀
folder_name,folder_format = os.path.splitext(folder)
if folder_format == '.mp4':
video_name = filename + '\\' + dir_name + '\\' + folder
while True:
if len(threading.enumerate()) <= 10: #进程最大数
break
t = threading.Thread(target = Copy,args = (video_name,save_folder,folder_name))
t.start()
#print(video_name)
open(save_folder+'\\folder.txt','w').write(str(folder_list))
我在遍历wallpaper项目根目录的时候加了个判定,如果这个壁纸项目下的视频已经被我搞过一次了那么就跳过,没搞过就将这个文件夹的名字添加到folder_list列表中。 在进入二级文件folder的之后,我们直接通过os.path.splitext函数将文件名拆分成文件名+文件后缀。 如果文件后缀是.mp4就复制视频文件。而copy函数的使用方法也十分的简单,我们只需要传递两个变量进去就可以了。 我们定义一个复制的方法,这样方便我们使用threading库来创建线程
def Copy(video_name,save_folder,folder_name):
copy(video_name,save_folder)
print('复制成功:'+folder_name)
这样在复制结束后就会将结果反馈到命令提示符上了。不过值得一提的是,创建线程的时候一定要限制线程数,第一次搞的时候直接一次性创建了70个线程,还好眼疾手快直接把主程序给杀了,不然就崩了。所以创建线程要注意限制。
while True:
if len(threading.enumerate()) <= 10
break
如果你想体验飞一般的感受可以将这个片段给删除 这个片段的作用:先用enumerate拆包然后用len()函数计算元组中的元素数量,也就是线程数,与10进行比对,如果小于线程数小于10,就跳出这个while循环,如果大于10就继续循环。你可以预估自己电脑的性能,然后选择最大线程数,因为限制线程数后会损失点效率。
t = threading.Thread(target = Copy,args = (video_name,save_folder,folder_name))
t.start()
向target传递函数名,向args传递函数要使用的变量,要开启线程要使用start()方法,这个可以使用复合写法将start()写在上面一行的末尾
t = threading.Thread(target = Copy,args = (video_name,save_folder,folder_name)).start()
我们之前已经说过了为了防止多次复制已复制过的视频,我们往一个列表中传递文件夹名,但是我们在这一次运行时列表中添加了一堆的文件名,但是下次使用的时候又是一切从0开始,使用我们要将这个列表传到程序外面,这样第二次运行时只要读取存在程序外面的列表就可以知道上次的进程了。
---snip---
for folder_list in open(save_folder+'\\folder.txt','r'):
folder_list = eval(folder_list)
---snip---
open(save_folder+'\\folder.txt','w').write(str(folder_list))
我们使用只读模式(r)打开储存着文件名列表的文本。读取出里面的资料,但是我们知道在写入的时候,数据不能是列表形式的,所以存储的时候要转变成字符串,这样读取出来的数据也是字符串形式,这里就要用到eval函数来转变数据(eval除了可以转为列表形式还可以转变成字典形式)。这样第二次使用的时候读取第一次使用结束时传递出的数据,如何筛选文件夹,提高工作效率。