题目链接
建立字典DATA_HUB,将数据集名称的字符串映射到数据集相关的二元组上,这个二元组包含数据集的url和验证文件完整性的sha-1密钥
import hashlib
import os
import tarfile
import zipfile
import requests
#@save
DATA_HUB = dict()
DATA_URL = 'http://d2l-data.s3-accelerate.amazonaws.com/'
定义download函数用来下载数据集,并返回下载文件的名称。 如果缓存目录中已经存在此数据集文件,并且其sha-1与存储在DATA_HUB中的相匹配, 我们将使用缓存的文件。
def download(name, cache_dir=os.path.join('..', 'data')): #@save
"""下载一个DATA_HUB中的文件,返回本地文件名"""
assert name in DATA_HUB, f"{name} 不存在于 {DATA_HUB}"
url, sha1_hash = DATA_HUB[name]
# 递归创建目录
os.makedirs(cache_dir, exist_ok=True)
fname = os.path.join(cache_dir, url.split('/')[-1])
# 检查本地是否已有缓存文件,如果有并且哈希值匹配,则直接返回本地文件路径
if os.path.exists(fname):
sha1 = hashlib.sha1()
with open(fname, 'rb') as f:
while True:
data = f.read(1048576)
if not data:
break
sha1.update(data)
if sha1.hexdigest() == sha1_hash:
return fname # 命中缓存
print(f'正在从{url}下载{fname}...')
r = requests.get(url, stream=True, verify=True)
with open(fname, 'wb') as f:
f.write(r.content)
return fname
实现两个实用函数分别用于:下载并解压zip和tar文件,另一个是将所有数据集从DATA_HUB下载到缓存目录中。
def download_extract(name, folder=None): #@save
"""下载并解压zip/tar文件"""
fname = download(name)
base_dir = os.path.dirname(fname)
data_dir, ext = os.path.splitext(fname)
if ext == '.zip':
fp = zipfile.ZipFile(fname, 'r')
elif ext in ('.tar', '.gz'):
fp = tarfile.open(fname, 'r')
else:
assert False, '只有zip/tar文件可以被解压缩'
fp.extractall(base_dir)
return os.path.join(base_dir, folder) if folder else data_dir
def download_all(): #@save
"""下载DATA_HUB中的所有文件"""
for name in DATA_HUB:
download(name)
用于递归地创建目录
os.makedirs(path, mode, exist_ok=False)
path:要创建的目录,可以为相对路径或绝对路径
mode:指定权重模式
False表示当目标目录已存在时,抛出OSError
os.makedirs(cache_dir, exist_ok=True)
os.path.join()用来拼接多个路径字符串。
import os
path1 = 'a'
path2 = 'b'
path3 = 'c'
path = os.path.join(path1,path2,path3)
print(path)
a\b\c
判断文件或者文件夹是否存在
import os
path_exits = os.path.exists('../data')
print(path)
True
获取文件所在目录路径
import os
import sys
# print(sys.path[0])
fname = sys.path[0] # 输出当前文件所在目录
file = '../src/09test.ipynb'
print(fname)
# print (os.path.abspath('.'))
dir = os.path.dirname(fname)
file_dir = os.path.dirname(file)
print(dir)
print(file_dir)