文章目录
- 一、代码
- 1.下载和缓存数据集
- 【相关总结】
- 1.os.makedirs()
- 2.os.path.join()
- 3.os.path.exits()
- 4.os.path.dirname()
一、代码
题目链接
1.下载和缓存数据集
建立字典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:breaksha1.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_dirdef download_all(): #@save"""下载DATA_HUB中的所有文件"""for name in DATA_HUB:download(name)
【相关总结】
1.os.makedirs()
用于递归地创建目录
os.makedirs(path, mode, exist_ok=False)
path:要创建的目录,可以为相对路径或绝对路径
mode:指定权重模式
False表示当目标目录已存在时,抛出OSError
os.makedirs(cache_dir, exist_ok=True)
2.os.path.join()
os.path.join()用来拼接多个路径字符串。
import ospath1 = 'a'
path2 = 'b'
path3 = 'c'path = os.path.join(path1,path2,path3)
print(path)
a\b\c
3.os.path.exits()
判断文件或者文件夹是否存在
import os
path_exits = os.path.exists('../data')
print(path)
True
4.os.path.dirname()
获取文件所在目录路径
import osimport 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)