下载一个gzip文件,md5校验和它,然后保存提取的数据,如果匹配

时间:2016-09-23 01:39:16

标签: python io gzip md5 downloading

我目前正在尝试使用Python下载两个文件,一个是gzip压缩文件,另一个是校验和。

我想验证gzip文件的内容是否与md5校验和匹配,然后我想将内容保存到目标目录。

我找到了如何下载文件here,并学习了如何计算校验和here。我从JSON配置文件加载URL,并学习了如何解析JSON文件值here

我把它全部放在下面的脚本中,但是我试图存储gzip压缩文件的已验证内容。

import json
import gzip
import urllib
import hashlib

# Function for creating an md5 checksum of a file
def md5Gzip(fname):
    hash_md5 = hashlib.md5()

    with gzip.open(fname, 'rb') as f:
        # Make an iterable of the file and divide into 4096 byte chunks
        # The iteration ends when we hit an empty byte string (b"")
        for chunk in iter(lambda: f.read(4096), b""):
            # Update the MD5 hash with the chunk
            hash_md5.update(chunk)

    return hash_md5.hexdigest()

# Open the configuration file in the current directory
with open('./config.json') as configFile:
    data = json.load(configFile)

# Open the downloaded checksum file
with open(urllib.urlretrieve(data['checksumUrl'])[0]) as checksumFile:
    md5Checksum = checksumFile.read()

# Open the downloaded db file and get it's md5 checksum via gzip.open
fileMd5 = md5Gzip(urllib.urlretrieve(data['fileUrl'])[0])

if (fileMd5 == md5Checksum):
    print 'Downloaded Correct File'
    # save correct file
else:
    print 'Downloaded Incorrect File'
    # do some error handling

1 个答案:

答案 0 :(得分:1)

md5Gzip中,返回tuple而不是哈希。

def md5Gzip(fname):
    hash_md5 = hashlib.md5()
    file_content = None

    with gzip.open(fname, 'rb') as f:
        # Make an iterable of the file and divide into 4096 byte chunks
        # The iteration ends when we hit an empty byte string (b"")
        for chunk in iter(lambda: f.read(4096), b""):
            # Update the MD5 hash with the chunk
            hash_md5.update(chunk)
        # get file content
        f.seek(0)
        file_content = f.read()

    return hash_md5.hexdigest(), file_content

然后,在您的代码中:

fileMd5, file_content = md5Gzip(urllib.urlretrieve(data['fileUrl'])[0])