Python实战篇——利用Python下载并解压压缩文件

  • 前言
  • 应用背景
  • 工具包准备
  • 压缩文件下载
  • 压缩文件解压
  • 拓展
  • 总结

前言

挺久没整理自己的学习笔记了,今天就理一下如何通过Python下载并自动解压在线打包好的压缩包吧~

应用背景

公司的产品日志(log)是每天自动在服务器上打包好的,在当天能下载前一天的日志,在日常工作中的数据分析经常需要通过处理日志文件来产出结果。而在需要同时处理多个产品日志,且几乎每天都要到浏览器粘贴个链接来下载日志,还得到文件夹中手动解压……的情况下,让我越来越忍受不了这种又费时间又费精力还低效的重复性操作,于是本文的内容就这么产生了。。m(o_ _)m

工具包准备

import requests
from datetime import timedelta,date,datetime
import time
import os
import zipfile

压缩文件下载

压缩包下载先是通过requests.get()来获取,再通过os.write()来写入到本地文件夹中。

yday = (date.today()+timedelta(days=-1)).strftime('%Y%m%d') # 获取昨日日期
r =  requests.get('http://XXXXXXXX/XX_%s.zip'%yday) # 获取以日期命名的压缩包信息
with open(r'D:\数据源\XX_%s.zip'%yday,'wb') as code: # 将压缩包内容写入到 "D:\数据源\" 下,并按日期命名code.write(r.content)
print('昨日XX日志下载完成。')

这样日志就下载下来了~

压缩文件解压

接下来就到关键一步了,压缩包解压要用的是zipfile这个包。

zip_file = zipfile.ZipFile(r'D:\数据源\XX_%s.zip'%yday)
zip_list = zip_file.namelist() # 压缩文件清单,可以直接看到压缩包内的各个文件的明细
for f in zip_list: # 遍历这些文件,逐个解压出来,zip_file.extract(f,r'D:\数据源')
zip_file.close() # 不能少!
print('昨日日志解压完成,请在文件夹中验收!') # 当然我是不需要查收的(*/ω\*)

这里的解压操作实际就相当于鼠标右键“解压到当前文件夹”的效果。

完成解压后运行.close()是个比较好的习惯,否则可能会导致包括但不限于:

  1. 文件会一直被占用着,可能无法重新打开;
  2. 在进程结束之前文件都删不掉;
  3. 文件内容不能即时 flush 到磁盘直到进程结束;

到此,整个流程在无需打开浏览器和文件夹的情况下便自动完成了。
为了方便日常运行代码(也为了好看。。),这里把上面的两个流程包装成一个函数,下载解压一条龙服务~~

#下载昨日日志
def download_XXlog():yday = (date.today()+timedelta(days=-1)).strftime('%Y%m%d') # 获取昨日日期r =  requests.get('http://XXXXXXXX/XX_%s.zip'%yday) # 获取以日期命名的压缩包信息with open(r'D:\数据源\XX_%s.zip'%yday,'wb') as code: # 将压缩包内容写入到 "D:\数据源\" 下,并按日期命名code.write(r.content)print('昨日XX日志下载完成。') zip_file = zipfile.ZipFile(r'D:\数据源\XX_%s.zip'%yday)zip_list = zip_file.namelist() # 压缩文件清单,可以直接看到压缩包内的各个文件的明细for f in zip_list: # 遍历这些文件,逐个解压出来,zip_file.extract(f,r'D:\数据源')zip_file.close() # 不能少!print('昨日日志解压完成,请在文件夹中验收!')
download_XXlog()

拓展

作为拓展,这里再加一个可以根据实际情况输入(input)起始和终止日期,来下载一个特定时间段日志的函数,这里就涉及了datetime和time这两个工具包了。

#下载多日日志
def daterange(start_date,end_date): # 根据input构建时间序列,存放于 date_all 列表中start_date = datetime.strptime(start_date,"%Y%m%d")end_date = datetime.strptime(end_date,"%Y%m%d")date_all = []while start_date<=end_date:date_all.append(int(start_date.strftime('%Y%m%d')))start_date+=timedelta(days=1)return date_alldef start_function(): # 获取起始、终止日期(input),调用上述函数start_date = input('请输入起始日期(如:20201101):')end_date = input('请输入终止日期(如:20201111):')return daterange(start_date,end_date)def download_log_plus(): lst = start_function() # 调用函数构建时间序列lst_exists = [] # 用于下面判断for i in lst: # 调用日期,判断本地文件中是否已经下载了该日期的日志,避免重复下载。if os.path.exists(r'D:\数据源\XX_%s.zip'%i):lst_exists.append(i)print('%s日志已存在'%i)else:r =  requests.get('http://XXXXXXXX/XX_%s.zip'%i)if str(r) == '<Response [404]>':lst_exists.append(i)print('%s日志暂未打包,请重新选择日志下载日期区间或核对日志下载链接是否有误。'%i)else:with open(r'D:\数据源\XX_%s.zip'%i,'wb') as code:code.write(r.content)print('%s日志下载完成'%i)zip_file = zipfile.ZipFile(r'D:\数据源\XX_%s.zip'%i)zip_list = zip_file.namelist()for f in zip_list:zip_file.extract(f,r'D:\数据源')zip_file.close()print('%s日志解压完成。'%i)print('日志下载并解压完成,共下载并解压了%s天的日志,请在文件夹中验收!'%(len(lst)-len(lst_exists)))
download_log_plus()

总结

  1. 本代码的应用场景可能有限,应该只适用于文本文件压缩包的下载,其他场景我还没接触过,欢迎各位大神提点;
  2. 压缩包的下载分两个步骤:①读取压缩包信息;②保存到本地;网络传输速度慢也可能影响代码运行的速度;
  3. 文件解压后记得运行.close()函数,原因上面已经提到了;
  4. datetime确实是个很好用的包~~~

利用Python下载并解压压缩文件相关推荐

  1. python批量解压文件_python 批量解压压缩文件的实例代码

    下面给大家介绍python 批量解压压缩文件的实例代码,代码如下所述: #/usr/bin/python#coding=utf-8import os,sys import zipfile open_p ...

  2. R语言使用unzip函数解压压缩文件(Extract or List Zip Archives)

    R语言使用unzip函数解压压缩文件(Extract or List Zip Archives) 目录 R语言使用unzip函数解压压缩文件(Extract or List Zip Archives) ...

  3. php tp5在线解压压缩文件

    php tp5在线解压压缩文件 没啥原理,直接上代码把 解压方法 /*** 解压zip文件到指定目录* @param {string} $filepath: 文件路径* @param {string} ...

  4. java csv文件tozip后损坏_java上传并下载以及解压zip文件有时会报文件被损坏错误分析以及解决...

    情景描述: 1.将本地数据备份成zip文件: 2.将备份的zip文件通过sftp上传到文件服务器: 3.将文件服务器上的zip文件下载到运行服务器: 4.将下载的zip文件解压到本地(文件大小超过50 ...

  5. centos 安装并使用rar解压压缩文件

    下载 下载自己的版本,下边以64位的为例: wget http://www.rarlab.com/rar/rarlinux-x64-5.6.1.tar.gz 解压 到文件夹/usr/local/rar ...

  6. mysql官网下载后解压是文件夹_mysql解压文件安装

    一直以来都习惯了使用MySQL安装文件(.exe),今天下载了一个.zip版本的MySQL,安装过程中遇到了一些问题,如下: 1.在MySQL官网上(http://dev.mysql.com/down ...

  7. 使用shell脚本一键式解压压缩文件

    话不多说,先上代码: #!/bin/bash cd /opt/software ----文件的目录位置 count=`ls -l | grep '^-' | wc -l` ----保存当前目录下的文件 ...

  8. 【Delphi】从内存读取或解压压缩文件(RAR、ZIP、TAR、GZIP等)(二)

    D7zTool是一个基于7-zip库开发的解压缩示例程序,除了应用程序本身,仅包含一个7z.dll 主要界面: D7zTool示例程序demo的pas源码 unit Unit1;interfaceus ...

  9. Linux:shell 脚本 自动解压压缩文件tar.gz到指定目录

    具体情境 Ubuntu16.04系统,将.tar.gz格式的文件从/home/myftp/upload/nuodongiot目录自动解压到/home/myftp/upload/backupcopy目录 ...

  10. IOS下载并解压zip文件

    首先导入zipArchive库,点击下载 func downloadSource(path:NSString){var url = NSURL(string: NSString(format: &qu ...

最新文章

  1. WINCE之“系统事件”——System/Events
  2. react 点击两次_javascript – 为什么在React中需要两次绑定onClick?
  3. 附近有什么?8款可以查周边的App
  4. 友元函数 友元类 友元成员函数
  5. [物理学与PDEs]第1章第6节 电磁场的标势与矢势 6.3 例 --- 电偶极辐射
  6. ECCV2020 | Cityscapes上83.7 mIoU,通过解耦的主体和边缘监督改进语义分割
  7. 华为手机芯片断供,有没有可能回收旧手机解决目前困境?
  8. 基于WirёGuαrd和UDP speeder的网游加速实现方案
  9. Web开发编程语言是最适合新手的吗-开课吧
  10. vegas怎么添加淡水墨效果?
  11. qtableview 查询_在QTableView中搜索/查找功能
  12. Mac安装Octave
  13. 调用钉钉接口和微信实现消息通知
  14. 会员(用户)数据化运营——指标介绍
  15. 01-SA8155 QNX 虚拟机Hypervisor
  16. (转) 两天快速开发一个自己的微信小程序
  17. 使用Stream编译出现的stream has already been operated upon or closed的问题
  18. 心得三、做事先做人(转载)
  19. 深度学习模型的Android部署方法
  20. GLES2.0中文API-glReadPixels

热门文章

  1. PhotoShop软件笔记
  2. Matlab中的ttest2()函数实现
  3. SPSS一元线性回归
  4. 第十三周助教心得体会
  5. 固态硬盘(SSD)——NAND闪存芯片(颗粒)QLC、SLC、MLC、TLC
  6. 如何将pdf压缩到最小?怎么将pdf文档压缩至更小?
  7. App登录功能(用户名+密码)
  8. 微软升级网页版Skype 没有帐户也能拨打网络电话
  9. MSP430FR5994LannchPad开发笔记之三:MSP430的IO复用以及如何去获取IO复用功能
  10. 软件获取imei和imsi_获取设备信息(imei、imsi、uuid)的调整使用plus.device.getInfo方法的说明...