因为要迁移下载的视频文件(含部分未解压文件),发现没有太合适的程序,于是便用python3写一个。内容如下:
第一步:首先,先建一个解压缩文件的MyUnRar用来解压要迁移视频的文件夹,避免有些还没解压。
import zipfile
import os
from pathlib import Path
import rarfile
def unzip_file(file_zip_path):
new_zip_dir = file_zip_path.rsplit('\\', 1)[0] + '/data'
if not os.path.isdir(new_zip_dir):
os.makedirs(new_zip_dir)
zFile = zipfile.ZipFile(file_zip_path, "r")
# ZipFile.namelist(): 获取ZIP文档内所有文件的名称列表
for fileM in zFile.namelist():
# zFile.extract(fileM, new_zip_dir)
# 解压出来单个文件
extracted_path = Path(zFile.extract(fileM, new_zip_dir))
# print("fileM.encode('cp437').decode('gbk')",fileM.encode('cp437').decode('gbk'))
# print("extracted_path",extracted_path)
# 文件重命名,将中文的文件名还原
extracted_path.rename(new_zip_dir + '//' + fileM.encode('cp437').decode('gbk'))
zFile.close()
return new_zip_dir
def unrar_file(filename):
new_zip_dir = filename.rsplit('\\', 1)[0] + '/data'
if not os.path.isdir(new_zip_dir):
os.makedirs(new_zip_dir)
rar = rarfile.RarFile(filename, mode='r') # mode的值只能为'r'
rar.extractall(new_zip_dir) # 解压文件
rar.close() # 关闭文件,必须有,释放内存
def chkzipdir(strdir):
for root, dirs, files in os.walk(strdir, topdown=False):
for name in files:
file_name_path = os.path.join(root, name)
if os.path.isfile(file_name_path):
print("准备解压", file_name_path)
filename = os.path.basename(file_name_path)
if filename.endswith('.zip'):
unzip_file(file_name_path)
elif filename.endswith('.rar'):
unrar_file(file_name_path)
else:
print("不是压缩文件", file_name_path)
else:
print("不是文件", file_name_path)
第二步:建立main.py文件用来对要迁移的文件夹进行处理(我是小白,更小白注意,用这个运行。第一个py文件是用来引用)
import os
import re
import shutil
import MyUnRar as myRar
def getfilenames(filepath='', filelist_out=[]):
for fpath, dirs, fs in os.walk(filepath):
for f in fs:
fi_d = os.path.join(fpath, f)
if os.path.splitext(fi_d)[1] in ['.mp4', '.avi', '.MP4', '.AVI', 'ts', '.mkv']:
filelist_out.append(re.sub(r'\\', '/', fi_d))
else:
pass
filelist_out.sort()
return filelist_out
def rm_move(src, dst): # src:源目录 dst:新目录
s = getfilenames(src) # 源目录
count = 0
for i in s:
# 需要增加判断,仅仅新目录中有没有的视频文件至指定的目录
count += 1
try: # 程序正常时,即要移动的文件和目的地文件没有相同的文件,用shutil.move命令
shutil.move(i, dst) # 递归的去移动文件,它类似mv命令,其实就是重命名,如果有重复文件报错
except Exception as e: # 程序异常时,即要移动的文件和目的地文件有相同的文件,用shutil.copy命令,并删除源文件
print(e) # 输出错误内容
shutil.copy2(i, dst) # 拷贝文件,用它有重复文件覆盖
os.remove(i) # 删除拷贝的源文件
if count > 0:
print('成功从源目录%s移动到新目录%s视频文件:%d 个' % (src, dst, count))
else:
print("没有视频文件可以进行迁移!")
def del_emp_dir(path): # 删除迁移视频文件夹中的空目录函数,发现删除目录时如是迅雷建立的文件夹,即便为空,里面可能还存在隐藏文件,故不能删除
for (root, dirs, files) in os.walk(path):
for item in dirs:
this_dir = os.path.join(root, item)
try:
os.rmdir(this_dir) # os.rmdir() 方法用于删除指定路径的目录。仅当这文件夹是空的才可以, 否则, 抛出OSError。
print(this_dir)
except Exception as e:
print('错误!', e)
if __name__ == '__main__':
src_dir = input("请输入源目录以便搜索及转移视频文件使用:")
dst_dir = input("请输入新目录以便迁移视频文件使用:")
if not os.path.exists(dst_dir): # 如果没有要新建的目录则可以
os.mkdir(dst_dir) # 创建新目录
myRar.chkzipdir(src_dir) # 要搜索及移动视频文件夹中如有压缩文件都解压到data文件夹中
rm_move(src_dir, dst_dir) # 搜索及移动视频文件
del_emp_dir(src_dir) # 删除搜索及移动视频文件中的空文件夹
else:
str_answer = input(" 文件夹已存在,您是否确定要在这个文件夹中操作,'Y'继续,'N'退出")
if str_answer.lower() == 'y':
myRar.chkzipdir(src_dir) # 要搜索及移动视频文件夹中如有压缩文件都解压到data文件夹中
rm_move(src_dir, dst_dir) # 搜索及移动视频文件
del_emp_dir(src_dir) # 删除搜索及移动视频文件中的空文件夹
elif str_answer.lower() == 'n':
print("程序终止!")
else:
print("您输入的有问题!")
第三步:计划后续改造成直接运行的程序并带窗体界面,目前的还是不太友好,但基本功能有了。代码参考了网上的部分内容。