请求是一个非常好的库.我想用它来下载大文件(> 1GB).问题是不可能将整个文件保存在内存中我需要以块的形式读取它.这是以下代码的问题
import requests
def DownloadFile(url)
local_filename = url.split('/')[-1]
r = requests.get(url)
f = open(local_filename, 'wb')
for chunk in r.iter_content(chunk_size=512 * 1024):
if chunk: # filter out keep-alive new chunks
f.write(chunk)
f.close()
return
Run Code Online (Sandbox Code Playgroud)
由于某种原因它不起作用.在将其保存到文件之前,它仍会将响应加载到内存中.
UPDATE
如果你需要一个可以从FTP下载大文件的小客户端(Python 2.x /3.x),你可以在这里找到它.它支持多线程和重新连接(它确实监视连接),它还为下载任务调整套接字参数.
有没有办法使用部分下载功能通过HTTP下载巨大且仍在增长的文件?
似乎这段代码每次执行时都会从头开始下载文件:
import urllib
urllib.urlretrieve ("http://www.example.com/huge-growing-file", "huge-growing-file")
Run Code Online (Sandbox Code Playgroud)
我想要:
是否存在HTTP_RANGE在PHP中正确解析标头的方法?我想在重新发明轮子之前我会问这里.
我目前正在使用
preg_match('/bytes=(\d+)-(\d+)/', $_SERVER['HTTP_RANGE'], $matches);
Run Code Online (Sandbox Code Playgroud)
解析标题,但不包括标题的所有可能值,所以我想知道是否有一个功能或库可以做到这一点?
提前致谢.
我有一个文件要下载(从 json 中提取的下载路径。例如:)http://testsite/abc.zip。
我需要帮助才能执行,所有 5 个线程都应将abc.zip文件下载到输出目录,并且下载必须是Asynchronous或concurrent。
目前使用下面的代码,它确实下载了 5 次文件,但它会一一下载(同步)。
我想要的是,同时下载。
def dldr(file=file_url, outputdir=out1):
local_fn = str(uuid.uuid4())
if not os.path.exists(outputdir):
os.makedirs(outputdir)
s = datetime.now()
urllib.urlretrieve(file, outputdir + os.sep + local_fn)
e = datetime.now()
time_diff = e - s
logger(out1, local_fn, time_diff)
for i in range(1, 6):
t = threading.Thread(target=dldr())
t.start()
Run Code Online (Sandbox Code Playgroud)
我有一个连接到许多服务器之一的Web服务器.Web服务器最多可以排队40个作业,每个作业可能需要20分钟或30个小时才能运行.
Web服务器使用套接字连接到serverlet,serverlet运行通过使用线程发送的作业.
我想对可以一次运行的线程(作业)的数量设置上限,比如3,一旦达到该限制,它就会保持主线程.当其中一个线程结束时,它允许主线程继续并拾取另一个作业.
# Wait for thread count to reduce before continuing
while threading.active_count() >= self.max_threads:
pass
Run Code Online (Sandbox Code Playgroud)
我目前正在使用循环使我的主线程等待,直到有一个免费线程可用.它有效,但感觉就像一个快速而肮脏的解决方案.我想知道是否有更好的方法可以做到这一点?
server.py
import socket
import sys
import urllib, urllib2
import threading
import cPickle
from supply import supply
class supply_thread(threading.Thread):
def __init__(self, _sock):
threading.Thread.__init__(self)
self.__socket = _sock
def run(self):
data = self.readline()
self.__socket.close()
new_supply = supply.supply(data)
new_supply.run()
def readline(self):
""" read data sent from webserver and decode it """
data = self.__socket.recv( 1024 )
if data:
data = cPickle.loads(data)
return data
class server:
def …Run Code Online (Sandbox Code Playgroud) 我有一个用例,需要使用多个线程分部分下载大型远程文件。每个线程必须同时(并行)运行,获取文件的特定部分。期望是在成功下载所有部分后将这些部分组合成一个(原始)文件。
也许使用请求库可以完成这项工作,但是我不确定如何将其多线程化为将块组合在一起的解决方案。
url = 'https://url.com/file.iso'
headers = {"Range": "bytes=0-1000000"} # first megabyte
r = get(url, headers=headers)
Run Code Online (Sandbox Code Playgroud)
我还考虑使用 python 来编排下载,但我不确定这是正确的方法。它似乎太复杂了,并且偏离了普通的 Python 解决方案。像这样的东西:
curl --range 200000000-399999999 -o file.iso.part2
Run Code Online (Sandbox Code Playgroud)
有人能解释一下你会如何处理这样的事情吗?或者发布一个在 Python 3 中工作的代码示例?我通常很容易找到与Python相关的答案,但这个问题的解决方案似乎让我无法理解。
python ×5
http ×3
apache ×1
curl ×1
download ×1
http-headers ×1
partial ×1
php ×1
python-2.7 ×1
python-3.x ×1
range ×1
stream ×1