python下载文件损坏_Python简单的多线程下载文件损坏

这是我的第一篇文章。我一直在进行python编程,最近正在开发一个多线程下载器。但问题是我的文件(jpg是我的目标)被损坏。另外随着followinf输入:http://www.aumathletics.com/images_web/headerAUMLogo.jpgPython简单的多线程下载文件损坏

它显示错误

的文件被损坏。

下面是代码: -

import os, sys, requests

import threading

import urllib2

import time

URL = sys.argv[1]

def buildRange(value, numsplits):

lst = []

for i in range(numsplits):

if i == 0:

lst.append('%s-%s' % (i, int(round(1 + i * value/(numsplits*1.0) + value/(numsplits*1.0)-1, 0))))

else:

lst.append('%s-%s' % (int(round(1 + i * value/(numsplits*1.0),0)), int(round(1 + i * value/(numsplits*1.0) + value/(numsplits*1.0)-1, 0))))

return lst

def main(url=None, splitBy=5):

start_time = time.time()

if not url:

print "Please Enter some url to begin download."

return

fileName = "image.jpg"

sizeInBytes = requests.head(url, headers={'Accept-Encoding': 'identity'}).headers.get('content-length', None)

print "%s bytes to download." % sizeInBytes

if not sizeInBytes:

print "Size cannot be determined."

return

dataDict = {}

# split total num bytes into ranges

ranges = buildRange(int(sizeInBytes), splitBy)

def downloadChunk(idx, irange):

req = urllib2.Request(url)

req.headers['Range'] = 'bytes={}'.format(irange)

dataDict[idx] = urllib2.urlopen(req).read()

# create one downloading thread per chunk

downloaders = [

threading.Thread(

target=downloadChunk,

args=(idx, irange),

)

for idx,irange in enumerate(ranges)

]

# start threads, let run in parallel, wait for all to finish

for th in downloaders:

th.start()

for th in downloaders:

th.join()

print 'done: got {} chunks, total {} bytes'.format(

len(dataDict), sum((

len(chunk) for chunk in dataDict.values()

))

)

print "--- %s seconds ---" % str(time.time() - start_time)

if os.path.exists(fileName):

os.remove(fileName)

# reassemble file in correct order

with open(fileName, 'w') as fh:

for _idx,chunk in sorted(dataDict.iteritems()):

fh.write(chunk)

print "Finished Writing file %s" % fileName

print 'file size {} bytes'.format(os.path.getsize(fileName))

if __name__ == '__main__':

main(URL)

这里的缺口可能是错了,所以这里是代码引擎收录(点)的COM/wGEkp878

我会很感激,如果有人能指出错误

编辑:由人提议

def buildRange(value, numsplits):

lst = []

for i in range(numsplits):

first = i if i == 0 else buildRange().start(i, value, numsplits)

second = buildRange().end(i, value, numsplits)

lst.append("{}-{}".format(first, second))

return lst

谁能告诉我锄保持part1 part2等名称下载的零件文件等

2015-09-14

AKM

+0

作为第一个猜它看起来你有更为复杂,它的buildRange功能应该是,这也可能是你的问题。更重要的是,我很抱歉,这不是你的问题的答案,但多线程下载这样的下载几乎肯定会花费更多的时间,而不是在单个请求中进行。原因是尽管您的所有数据都在同一时间下载,但您仍然受限于带宽,现在您还有许多其他事情正在进行。虽然这是一个很酷的实验,但绝对值得完成。 –

+0

你能告诉我如何存储作为part 1 2 3 4 etc下载的零件文件吗? –

+0

你原来的构建范围似乎工作,但新的做得好得多。真正的问题似乎是额外的新行字符被添加!每遇到'\ n',在它之前插入一个额外的0x0D。 –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值