运营那边有个需求。
下载了一批视频文件,由于当时下载的时候陆陆续续创建了很多文件夹,并且,每个文件夹下面还有子文件夹以及视频文件,子文件夹下面有视频文件或者文件夹
现在因为需要转码,转码软件只能对单个文件夹操作。
这时候找上我,问我能不能帮忙把所有的文件单独提取出来到一个文件夹中。他们那边转码完毕,还要放回原来的文件夹
这边琢磨下下。匆忙写了个脚本。功能实现了。但是代码需要优化(后面有空了再说吧)
使用递归方法获取每个文件绝对路径(不要单独的目录),并放入列表中。最终存到excel表中
excel表存2列,第一列是每个文件的绝对目录,第二列是文件名
使用shutil模块移动文件(这里是剪切,因为文件比较多。太占空间了)
考虑到目录中可能存在文件名一致的文件,这样移动到一个目录的话可能会覆盖原来的。
这边考虑文件名一致的话不移动,但是记录下路径。让运营决定怎么处理同名的文件(因为可能他们要存2份,或者说文件名一致,实际文件内容是有差别的)
失败记录.log文件用于记录在移动文件过程中某文件名变化或者文件不存在
(因为文件较多,这里有6000多文件。文件列表很快就获取到,但是从文件列表逐个移动文件过程中,万一某文件由于人为操作删除或者改名了或者其它因素导致列表中文件路径不对了。因此用了if else判断记录下)
重名文件信息.log用于记录重名文件。这个是给运营看的。让他们决定如何处理重名文件
这里多了一些print操作以及time.sleep操作,是为了后面打成exce程序执行的时候好看点,不然一个黑洞洞的窗口不太友善。多一些输出信息显得好点(文件太少的话可能瞬间执行完毕了。sleep一下显得好点)
!!!最后注意下,因为此脚本最后打成exe程序。准备放入某目录下执行。因此这里的this_path获取的是当前路径。假如自己使用pycharm或者python工具测试,需要指定一下测试路径
比如this_path="D:\\work\\tmp"
否则可能把你当前目录下的文件都移走到all_files下面了
import os
import xlwt,time,shutil
#获取当前文件所在绝对目录路径
this_path=os.path.abspath('.')
#定义个列表存放每个文件路径,便于后期操作
file_list=[]
#创建个方法,统计每个文件路径,并追加列表中。用到了递归
def get_all_file(dir_path):
for file in os.listdir(dir_path):
# print(file)
filepath=os.path.join(dir_path,file)
# print(filepath)
if os.path.isdir(filepath):
get_all_file(filepath)
else:
file_list.append(filepath)
return file_list
#执行上面方法,把每个文件绝对路径追加到列表中
get_all_file(this_path)
#定义总目录名,准备存放列表中所有文件
target_dir='all_files'
#创建一个总视频目录,用于存放视频文件
if not os.path.exists(target_dir):
print(target_dir+'作为总视频目录不存在,正在创建.....')
time.sleep(2)
os.mkdir(target_dir)
print(target_dir+"总视频目录创建成功")
time.sleep(2)
#创建一个excel表存放文件路径信息,第一列是目录,第二列是文件名
wb = xlwt.Workbook()
sh = wb.add_sheet('文件和目录信息')
row_count=0
for file in file_list:
dir_filename=os.path.split(file)
sh.write(row_count,0,dir_filename[0])
sh.write(row_count,1,dir_filename[1])
row_count+=1
wb.save("文件路径信息统计结果.xls")
#定义个日志存放异常信息以及重名文件
f_fail = open('失败记录.log','a') # 追加模式
f_same= open('重名文件信息.log','a') # 追加模式
#移动文件
print("开始移动文件.................")
time.sleep(2)
for file in file_list:
if os.path.exists(file):
file_name=os.path.split(file)[1]
target_path=os.path.join(target_dir,file_name)
if os.path.exists(target_path):
print(target_dir+"目录中----"+file_name+"----已经存在,移动失败")
f_same.write(target_dir+"目录中----"+file_name+"----已经存在,移动"+file+"失败\r\n")
else:
shutil.move(file,target_path)
time.sleep(0.1)
else:
print(file,"not exist")
f_fail.write(file+"----不存在\r\n")
print(file+"----不存在\r\n")
time.sleep(0.5)
print("程序执行完毕,3秒后退出")
time.sleep(3)
把程序打成exe
找到此文件
下面是测试过程
把此exe程序放入0512这个目录下。执行的时候他会查找每个目录下的子目录和文件。并统一放入新创建的all_files目录中。
同时记录excel表移动之前的路径信息。
同名文件不会移动,继续保持原来的路径
假如youku目录下也有个hehe.rtf文件,那么正常来说0512目录下或者0512\youku目录下,有一个hehe.ref文件不会被移动过去。但是会记录重名文件信息.log中
开始执行(记得关闭杀毒软件)
执行完毕,多了3个文件。一个excel表记录原文件路径的,2个日志文件
查看重名文件信息日志
此文件没被移动
其它目录下都空了
(尴尬)此exe程序也被移动过去了,这点有点不足(把自己移动过去了)。后期优化下吧
看一下excel表,第一列是原文件目录名,第二列是此文件名。转码之后可以通过excel表路径信息把文件再移动回去