开头导入模块
import os
import platform
import subprocess
import platform
os模块用来读写文件
platform用来获取操作系统信息
Linux输入pstree看进程树,而windows里面用tasklist。发现Chrome开多少个窗口就有多少个进程
subprocess是子进程创建和调度模块
subprocess详解
CHECKSUMS = {
'datasets.z01': 'da46277afe85d3a91c065e4751fb8175',
'datasets.z02': 'e274a9646323d954b00094ea424e4e4c',
这是一个字典,键是’datasets.z01’,单引号表示里面是字符串,这些文件合起来解压,成为一个zip
def main():
#Python 字典 keys() 方法以列表形式(并非直接的列表,若要返回列表值还需调用list函数)返回字典中的所有的键,例如datasets.z266
files = CHECKSUMS.keys()
#双引号里面是字符串
url_root = "https://data.csail.mit.edu/graphics/demosaicnet"
#os.path.abspath(_file_)返回脚本的绝对路径
# 再来一个os.path.dirname,就是脚本的父目录的绝对路径,即D:\image_processing\try\demosaicnet_torch-master
dst = os.path.dirname(os.path.abspath(__file__))
for f in files:
# 路径拼接,例如第一个fname是D:\image_processing\try\demosaicnet_torch-master\datasets.z01
fname = os.path.join(dst, f)
#第一个url是https://data.csail.mit.edu/graphics/demosaicnet\datasets.z01
url = os.path.join(url_root, f)
# curl和wget下载方式,curl更高级些
dl_cmd = ['curl', '-o', f, url]
# dl_cmd = ['wget', '-nv', url]
# 如果path存在
if os.path.exists(fname):
# 就说已经下载了,正在检查md5
print(f, 'already downloaded. Checking md5...')
else:
# 否则就在说正在下载
print("Running", " ".join(dl_cmd))
# 创建进程,开始下载文件,并且对的子进程完成
ret = subprocess.call(dl_cmd)
#看是哪个操作系统
# 如果是Linux
if platform.system() == "Linux":
# args 是['md5sum', fname],例如md5sum /d/image_processing/try/data/datasets.z01,这是linux下面的一个命令
# 标准输出流stdout,Run the command described by args. Wait for command to complete, then return a CompletedProcess instance.获取比特序列
# subprocess.Popen是一个类,check是一个实例
check = subprocess.Popen(['md5sum', fname], stdout=subprocess.PIPE)
# Python用花括号表示字典和集合两种对象:花括号内是空的,或者是键值对的,表示字典;花括号内是无重复元素的,表示集合。
# {print $1} 就是将某一行(一条记录)中以空格为分割符的第一个字段打印出来。
# awk用来提取列,作用是显示下载过程
checksum = subprocess.Popen(['awk', '{ print $1 }'], stdin=check.stdout, stdout=subprocess.PIPE)
# communicate() returns a tuple (stdout_data, stderr_data).
# strip去掉输出结果最后一行的换行符
checksum = checksum.communicate()[0].strip()
# 没有windows,只能在linux上面跑了
elif platform.system() == "Darwin":
check = subprocess.Popen(['cat', fname], stdout=subprocess.PIPE)
checksum = subprocess.Popen(['md5'], stdin=check.stdout, stdout=subprocess.PIPE)
checksum = checksum.communicate()[0].strip()
else:
raise Exception("unknown platform %s" % platform.system())
# 输出计算出的md5码,以及文件本身的MD5码
print("Checksum:", checksum, CHECKSUMS[f])
if checksum == CHECKSUMS[f]:
print(f, "MD5 correct, no need to download.")
continue
else:
print(f, "MD5 incorrect, re-downloading.")
try:
# MD5校验不通过,删除文件
os.remove(fname)
except OSError as e:
print("Could not delete {}: {}".format(f, e))
raise ValueError
ret = subprocess.call(dl_cmd)
system = platform.system()
print("Joining zip files")
# 把压缩包全集合到一起
cmd = " ".join(["zip", "-FF", os.path.join(dst, "datasets.zip"), "--out", os.path.join(dst, "joined.zip")])
subprocess.check_call(cmd, shell=True)
print("Extracting files")
cmd = " ".join(["unzip", os.path.join(dst, "joined.zip")])
subprocess.check_call(cmd, shell=True)
报错,windows那段用darwin和linux的都不行
但是用curl下载的时候一直报错说md5 incorrect
用wget下载又不行
先研读subprocess官方手册
md5sum是linux下的指令
awk工作原理
报错的时候很明显MD5码是一样的,奇怪,正常情况为什么要报错,就多了一个b’
都是一样的,只不过计算出来的是以b’开头,一种方法是删掉md5码检验部分,但是保留输出信息
另一种方法是把文件键值的md5码都加上b’,后者显然更加保险,先给两个文件加上试试看
但是还是不行
决定删掉md5校验的代码
下载的时候,z64的图标有问题
电脑存储太小,只能一边下载一边移动,不太会设置挂载盘符
z20没下载
还没移动的:63-99,dataset_zip
在移动的:267-333
U盘里有Trash文件夹·
linux系统删除文件后还是没有free空间
解决方法:显示隐藏文件
然后删除.Transh-1000就行了
下载后的文件太大了,winrar还不能用,换成7-Z就可以了,z01解压出来就得
在看hashlib的时候发现,可能是模块校验生成的MD5码是byte string类型的,而字典里面存放的md5是string类型的,因此字典的字符加上b’'之后还是不等于文件的md5