download_dataset.py代码研究

开头导入模块

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值