社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
最近在做动手深度学习的内容时,使用到了wget.download()函数,其中发生了一件很诡异的事儿,在kaggle上跑代码时有时候数据集能下载成功,有时候却一直报错:ValueError: not enough values to unpack (expected 2, got 1)
not enough values to unpack (expected 2, got 1)
代码如下:
def download_data():
data = os.getcwd() + '/data'
base_url = 'https://apache-mxnet.s3-accelerate.amazonaws.com/'
wget.download(
url = base_url + 'gluon/dataset/hotdog.zip',
out = data)
with zipfile.ZipFile('data', 'r') as z: # 解压数据集
z.extractall(os.getcwd())
download_data()
各种搜索找不到原因,后来看了下调用栈,发现了这么一句:
ValueError
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-9-b10f1b804f4f> in <module>
27
28
---> 29 download_data()
30
31 '''
<ipython-input-9-b10f1b804f4f> in download_data()
22 wget.download(
23 url = base_url + 'gluon/dataset/hotdog.zip',
---> 24 out = data)
25 with zipfile.ZipFile('data', 'r') as z: # 解压数据集
26 z.extractall(os.getcwd())
/opt/conda/lib/python3.7/site-packages/wget.py in download(url, out, bar)
531 # add numeric ' (x)' suffix if filename already exists
532 if os.path.exists(filename):
--> 533 filename = filename_fix_existing(filename)
534 shutil.move(tmpfile, filename)
535
/opt/conda/lib/python3.7/site-packages/wget.py in filename_fix_existing(filename)
267 """
268 dirname = u'.'
--> 269 name, ext = filename.rsplit('.', 1)
270 names = [x for x in os.listdir(dirname) if x.startswith(name)]
271 names = [x.rsplit('.', 1)[0] for x in names]
ValueError: not enough values to unpack (expected 2, g
在534行报错的地方,有个shutil.move函数,这个函数用于文件夹移动,所以初步怀疑是第一次下载好的数据集不为空,导致wget,download()函数会想办法将原来的数据集移到其他目录里面去,但是一般使用这个函数只会指定url和下载路径,很少见指定移动路径的,所以有一个思路是:要么在调用这个函数之前先判断路径是否已经存在了,存在就删除路径重新下载,或者路径不存在时才调用wget.download()。
更改之后的代码如下:
def download_data():
data = os.getcwd() + '/data'
base_url = 'https://apache-mxnet.s3-accelerate.amazonaws.com/'
if not os.path.exists(data): # 如果文件没有下载好,才进行下载
wget.download(
base_url + 'gluon/dataset/hotdog.zip',
data)
with zipfile.ZipFile('data', 'r') as z:
z.extractall(os.getcwd())
或者:
def download_data_2():
data = os.getcwd() + '/data'
base_url = 'https://apache-mxnet.s3-accelerate.amazonaws.com/'
if os.path.exists(data): # 如果文件已经下载好了,则删除文件重新进行下载
os.remove(data)
wget.download(
base_url + 'gluon/dataset/hotdog.zip',
data)
with zipfile.ZipFile('data', 'r') as z:
z.extractall(os.getcwd())
下图是我改了之后的代码,先将运行第一遍将数据集下载好,然后直接点击取消运行,再进行第二遍运行,结果证实了我的猜想是对的:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!