问题:现在遇到这样一个问题,服务器存储了很多软件包,这些包输入不同的产品,每个产品都有自己的配置,互相交叉,那么到底某一产品所有配置的软件包下载后,占用多大空间呢?
分析:从这个问题入手,了解到:软件包在服务端是以zip文件形式存放,下载地址链接如:http://xiazai.autul.com/PS_CHANGCHENG/PS_CHANGCHENG_V8_91_CN.zip,每个产品的配置是存储在Excel文档中。
OK,那么问题就是读取Excel文档,拼接成链接地址,访问每个地址下载包到指导路径。解压后就可以查看了。这么多包,该如何用Python程序实现下载呢?
分析了下,这个地址是一些固定的,加一些可以从Excel文档中读取的变量来组合成的,那么这些地址我们就可以用一个函数来实现。下载后的文件,也可以用一个函数来实现。
首先得需要用到读取Excel文档的模块:xlrd ,读取Excel文档;然后是os模块,判断存储路径;接着是用urllib模块,访问地址进行下载;中间用到了字符串拼接、数字取整、数字格式化输出、函数调用、忽略程序异常继续执行等。
实现代码:
import os
import urllib.request
import xlrd
def url_arg(pacage,code_big,code_lit):
url='http://xiazai.autul.com/'+str(pacage)+'/'+str(pacage)+'_V'+str(code_big)+'_'+str(code_lit)+'_CN.zip' #字符串拼接,注意传参要转化为str
return url
def url_file(pacage,code_big,code_lit):
file_name=str(pacage)+'_V'+str(code_big)+'_'+str(code_lit)+'_CN.zip'
return file_name
def url_arg_big(pacage,code_big,code_lit):
url='http://xiazai.autul.com/'+str(pacage)+'/'+str(pacage)+'_V'+str(code_big)+'_'+str(code_lit)+'_CN.ZIP' #字符串拼接,注意传参要转化为str,服务器上还有后缀为ZIP的包,大小写不一样,增加工作量啊
return url
def url_file_big(pacage,code_big,code_lit):
file_name=str(pacage)+'_V'+str(code_big)+'_'+str(code_lit)+'_CN.ZIP'
return file_name
file_path='F:\down1\\' #下载包的保存地址,注意要有‘\’
try:
if not os.path.exists(file_path):
os.makedirs(file_path) # 如果没有这个path则直接创建
workbook = xlrd.open_workbook(r'F:\down\H6_CN.xls')
sheet2_name = workbook.sheet_names()[1] # 获取第2个工作表名称
sheet2 = workbook.sheet_by_name(sheet2_name) # 获取第2个工作表内容
rownum = sheet2.nrows #工作表的行数
for i in range(rownum):
cells = sheet2.row_values(i) #获取每一行的内容
pacagename =cells[0]
code_big = round(cells[2])
code_lit = round(cells[3]*100) # 获取表格中的第1列,第3列,第4列 ,函数用round,不能int向下取整,十进制和二进制的区别
if code_lit<10: #当小数部分第一位未0时,需要补0
code_lit= "%02d"%code_lit #zfill函数用于字符串前面补0,数字用格式化前面补0
urldown = url_arg(pacagename,code_big,code_lit)
urldownbig=url_arg_big(pacagename,code_big,code_lit)
print(urldown)
file_result = url_file(pacagename,code_big,code_lit)
file_addr = '{}{}'.format(file_path,file_result) # 拼接文件名。
file_resultbig = url_file_big(pacagename, code_big, code_lit)
file_addrbig= '{}{}'.format(file_path,file_resultbig)
try:
urllib.request.urlretrieve(urldown,filename=file_addr) # 利用urllib.request.urltrieve方法下载软件包
except IOError as e:
print(1, e)
urllib.request.urlretrieve(urldownbig, filename=file_addrbig)
except IOError as e:
print(1, e)
except Exception as e:
print(2, e)