我一直坚持代码的这种特殊美感,我可以弄清楚它为什么不起作用。当我运行下面的代码时,我得到一个酸洗错误,它总是在不同的文件上。
这将下载随机数量的文件,然后神奇地停止。由于某种原因,第i个文件名(或者它选择停止的任何地方)突然变得不可拾取而其他之前的文件名。我可以看到所有中的所有不是可选择的,或者没有一个,但是任意数字不是可选择的,这只是奇怪的。
n=10
urls = ["ftp://ftp.sec.gov/{0:s}".format(f) for f in flist[:n]]
print urls
from multiprocessing import Pool
from urllib import urlretrieve
def download(url):
try:
file_name = str(url.split('/')[-1])
print file_name
return urlretrieve(url, file_name), None
except Exception as e:
return None, e
if __name__ == "__main__":
p = Pool(10)
p.map(download, urls)
我得到的错误是:
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
File "/usr/local/lib64/anaconda/lib/python2.7/multiprocessing/pool.py", line 250, in map
return self.map_async(func, iterable, chunksize).get()
File "/usr/local/lib64/anaconda/lib/python2.7/multiprocessing/pool.py", line 554, in get
raise self._value
multiprocessing.pool.MaybeEncodingError: Error sending result: '[(('0000950144-94-000788.txt', <mimetools.Message instance at 0x6333878>), None)]'. Reason: 'PicklingError("Can't pickle <type 'cStringIO.StringI'>: attribute lookup cStringIO.StringI failed",)'
有谁知道为什么第i个元素突然变得不易拾取?而其他人之前呢?我可以看到它是因为它认为第i个名称是一个字符串IO但没有任何意义,因为它之前的那个应该也一样。
答案 0 :(得分:1)
您将返回表示FTP标头的mimetools.Message对象。要么将其删除,要么在返回之前变成普通的字符串。
以下是后者的一个例子:
n=10
urls = ["ftp://ftp.sec.gov/{0:s}".format(f) for f in flist[:n]]
print urls
from multiprocessing import Pool
from urllib import urlretrieve
def download(url):
try:
file_name = str(url.split('/')[-1])
print file_name
filename,headers = urlretrieve(url, file_name)
return (filename, repr(headers), None
except Exception as e:
return None, e
if __name__ == "__main__":
p = Pool(10)
p.map(download, urls)