以下练习,文件名、函数名、变量名有许多不规范的地方,但是也是练习python脚本,就不修正了,在Linux环境上都能成功执行。
小标题不足以代表脚本功能,具体参看描述,有一些也没有按照要求写在,主要是自己练习。
一、模糊搜索文件
下载并解压文件素材压缩包
https://video.mugglecode.com/files.zip
使用Python筛选出符合特征的文件:
1.除了gif类型之外的其他类型
2.名字中包含有关键词project30或者commercial
Python实现。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests
import os
import zipfile
import shutil
file_url = 'https://video.mugglecode.com/files.zip'
file_name = 'files.zip'
files_path = r'./files'
# 根据url下载文件
r = requests.get(file_url)
with open(file_name, 'wb') as code:
code.write(r.content)
# 解压zip文件
f = zipfile.ZipFile(file_name, 'r')
for file in f.namelist():
f.extract(file, './')
# 会把目录下所有文件和文件夹名存入列表
files = os.listdir(files_path)
for file in files:
if not file.endswith('.gif') and (file.find('project30') != -1 or file.find('commercial') != -1):
print(file)
os.remove(file_name)
shutil.rmtree(files_path)
二、文件按后缀归类
下载并解压件素材压缩包
https://video.mugglecode.com/script_project1_files.zip
根据后缀名,将相同后缀名文件,分类到该后缀名目录中
Python实现。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import shutil
path = './files/'
files = os.listdir(path)
for file in files:
suffix = file.split('.')[-1]
if not os.path.lexists(path + suffix):
os.mkdir(path + suffix)
shutil.move(path + file, path + suffix)
三、文件归类
下载并解压件素材压缩包
https://video.mugglecode.com/problem2_files.zip
使用Python进行如下操作:
1. 把jpg、png、gif文件夹中的所有文件移动到image文件夹中,然后删除jpg、png、gif文件夹
2. 把doc、docx、md、ppt文件夹中的所有文件移动到document文件夹中,然后删除doc、docx、md、ppt文件夹
Python实现。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import shutil
path = './files/'
dst_dirs = ('image', 'document')
src_martix = (('jpg', 'png', 'gif'), ('doc', 'docx', 'md', 'ppt'))
# 生成目标目录,如果存在则删除后建立
for dst_dir in dst_dirs:
if os.path.exists(dst_dir):
shutil.rmtree(dst_dir)
os.mkdir(dst_dir)
for i in range(0,2):
src_dirs = src_martix[i]
for src_dir in src_dirs:
files = os.listdir(path + src_dir)
for file in files:
print("move:%s->%s" % (path + src_dir + r'/' + file, dst_dirs[i]))
shutil.move(path + src_dir + r'/' + file, dst_dirs[i])
shutil.rmtree(path)
四、zip文件
zip素材包
https://video.mugglecode.com/script_project3_files.zip
监控某目录,如果出现zip压缩文件,自动解压并删除原始zip压缩包
Python实现。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import shutil
import time
def scan_dir():
# os.listdir(),不填参数,表示列出当前目录下的文件信息
for file in os.listdir():
if file.endswith('.zip'):
return file
def unzip(file):
dir_name = file.split('.')[0]
path = './' + dir_name
os.mkdir(path)
shutil.unpack_archive(file, path)
os.remove(file)
if __name__ == "__main__":
while True:
file = scan_dir()
if file:
print('')
unzip(file)
time.sleep(5)
五、自动压缩文件
图片素材压缩包,下载后解压使用
https://video.mugglecode.com/image.zip
监测image文件夹,如果包含的文件大于等于5个,则将这些文件压缩到archive1.zip文件中,并删除原始文件。
再次监测到文件多于5个的时候,生成archive2.zip压缩包,以此类推。
Python实现,没有按需求做,而是改为5个文件打一个zip包。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import shutil
import time
path = './image/'
tmp_path = './tmp/'
def scan_image_dir():
files = os.listdir(path)
if len(files) >= 5:
return files[:5]
def zip(zip_name, files):
os.mkdir(tmp_path)
for file in files:
shutil.move(path + file, tmp_path + file)
shutil.make_archive(zip_name, 'zip', tmp_path)
shutil.rmtree(tmp_path)
if __name__ == "__main__":
archive_count = 1
while True:
zip_name = 'archive' + str(archive_count)
files = scan_image_dir()
if files:
zip(zip_name, files)
archive_count += 1
print(files, end='')
print('已压缩')
time.sleep(5)
六、删除重复文件
下载并解压这个文件素材压缩包
https://video.mugglecode.com/problem3_files.zip
删除重复的文件,包括不同文件夹内的重复文件
Python实现。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import hashlib
files_path = './files'
file_list = list()
def get_files_list(path):
files = os.listdir(path)
for file in files:
if os.path.isdir(path + os.path.sep + file):
get_files_list(path + os.path.sep + file)
else:
file_list.append(path + os.path.sep + file)
def md5(file):
hash_md5 = hashlib.md5()
with open(file, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
hash_md5.update(chunk)
return hash_md5.hexdigest()
def get_files_dict(file_list):
file_dict = dict()
for file in file_list:
file_md5 = md5(file)
if file_dict.get(file_md5) is None:
file_dict.setdefault(file_md5, file)
return file_dict
def dump_file_list(file_dict, file_list):
for md5_key in file_dict:
if file_dict[md5_key] in file_list:
file_list.remove(file_dict[md5_key])
return file_list
def del_file(file_list):
for file in file_list:
os.remove(file)
if __name__ == '__main__':
get_files_list(files_path)
file_dict = get_files_dict(file_list)
file_list = dump_file_list(file_dict, file_list)
print("待删除文件列表:%s" % file_list)
del_file(file_list)
主要是os、shutil相关函数及基本结构的练习。