python 自动解压文件放入对应的文件夹
准备工作:
环境 : mac python3.7
下载模块: os,re,zipfile,shutil
下载方法:pip intall
代码如下:
#导入包
import os
import re
import shutil
#这里是导出 zipfile 起个小名叫 zp
import zipfile as zp
demo_path = os.listdir("下载下来的文件路径")
dir_channel_path = os.listdir("需要识别的文件路径,这是为了创建文件夹用的")
dirs = "需要放入的文件夹路径")
demo_path_name = "下载下来的文件路径"
#zip格式文件解压
#首先我把解压方式封装了,方便调用
def un_zip_file(zip_files):
with zp.ZipFile(zip_files, 'r') as zfiles:
for file in zfiles.namelist():
# 判断是否有mac解压时自带的__MACOSX
if "__MACOSX" not in file:
zfiles.extract(file)
# 自动判断是否为zip文件并进行解压
# 肯定有人疑惑,我为啥要加for循环,我发现zipfile 会把.xlsx的文件判断为zip文件
for file_names in demo_path:
if os.path.splitext(file_names)[-1] == ".zip":
un_zip_file(file_names)
else:
print('解压完成')
"""
实现自动创建文件夹并将文件放入对应的文件夹
前提1:有已经搭好的文件夹+子文件夹
前提2:子文件夹的名字和文件有相同的名字
前提3:每个文件名字有唯一性,日期可以忽略不计
"""
#循环dir_channel_path文件夹,并将所有的子文件夹取出赋值给dir_name
for dir_name in dir_channel_path:
#取出每个子文件名中的中文字符,我每个子文件命名基本为1-XXX,2-xxx,这里用到了re匹配中文字符模块
dir_name_list = re.findall('[一-龥]', dir_name)
#re模块是一个字符一个字符的去取,最后形成["渠","道"],所以需要用.join 拼接起来
dir_name_join = "".join(dir_name_list)
# 自动创建文件夹
#.DS_Store是mac里会出现的默认值,需要去除
if ".DS_Store" not in dir_name:
#创建路径,路径需要用原始值,所以用的是dir_name
dir_name_mkdir = os.path.join(dirs, dir_name)
"""如果文件路径已经有了,就不要创建了,否则创建
os.path.exists()判断路径是否存在
os.mkdir() 创建文件夹
"""
if os.path.exists(dir_name_mkdir):
pass
else:
os.mkdir(dir_name_mkdir)
"""实现文件自动放入文件夹"""
# 循环取出demo_path里的文件
for dir_channel in demo_path:
#判断文件夹的名字是否在文件里面
if re.findall(dir_name_join, dir_channel):
#把文件名字拼接起来
dir_channel_list = "".join(dir_channel)
#把文件路径拼接好
dir_channel_names = os.path.join(demo_path_name, dir_channel_list)
#将文件名和文件相同的文件,放入对应文件夹里
shutil.move(dir_channel_names, dir_name_mkdir)
#这里处理的是文件名和文件不一样的,但确实有的os.path.splitext()把文件名和后缀分开,[0]是取文件名不取后缀;XXXX是文件名
elif "XXXX" in os.path.splitext(dir_channel)[0]:
shutil.move(os.path.join(demo_path_name, dir_channel),"文件夹路径")
else:
print("移动完成")
注意mac在使用zipfile时会出现一个问题,zipfile使用的编码是cp347,但mac使用的默认编码为utf-8会导致解码乱码问题,折磨了我一天,我是参考别的大佬的方法解决问题的
链接: https://blog.csdn.net/ao985438294363006/article/details/101349848



