相关疑难解决方法(0)

使用请求在python中下载大文件

请求是一个非常好的库.我想用它来下载大文件(> 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),你可以在这里找到它.它支持多线程和重新连接(它确实监视连接),它还为下载任务调整套接字参数.

python download stream python-requests

348
推荐指数
6
解决办法
27万
查看次数

使用部分下载(HTTP)下载文件

有没有办法使用部分下载功能通过HTTP下载巨大且仍在增长的文件?

似乎这段代码每次执行时都会从头开始下载文件:

import urllib
urllib.urlretrieve ("http://www.example.com/huge-growing-file", "huge-growing-file")
Run Code Online (Sandbox Code Playgroud)

我想要:

  1. 仅获取新写入的数据
  2. 仅在源文件变小(例如已旋转)时从头开始下载.

python http partial

21
推荐指数
1
解决办法
1万
查看次数

在PHP中解析HTTP_RANGE标头

是否存在HTTP_RANGE在PHP中正确解析标头的方法?我想在重新发明轮子之前我会问这里.

我目前正在使用

preg_match('/bytes=(\d+)-(\d+)/', $_SERVER['HTTP_RANGE'], $matches);
Run Code Online (Sandbox Code Playgroud)

解析标题,但不包括标题的所有可能值,所以我想知道是否有一个功能或库可以做到这一点?

提前致谢.

php apache http range http-headers

9
推荐指数
1
解决办法
2万
查看次数

如何使用 Python 2.7 通过多线程(异步下载)通过 HTTP 下载文件

我有一个文件要下载(从 json 中提取的下载路径。例如:)http://testsite/abc.zip

我需要帮助才能执行,所有 5 个线程都应将abc.zip文件下载到输出目录,并且下载必须是Asynchronousconcurrent

目前使用下面的代码,它确实下载了 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)

我已经阅读了带有多个连接请求帖子,它很有帮助,但没有解决所问问题的要求。

python multithreading http python-2.7

9
推荐指数
1
解决办法
1万
查看次数

设置最大线程以保持主线程的更好解决方案?

我有一个连接到许多服务器之一的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)

python python-multithreading

6
推荐指数
1
解决办法
987
查看次数

使用多个并行线程分部分下载大文件

我有一个用例,需要使用多个线程分部分下载大型远程文件。每个线程必须同时(并行)运行,获取文件的特定部分。期望是在成功下载所有部分后将这些部分组合成一个(原始)文件。

也许使用请求库可以完成这项工作,但是我不确定如何将其多线程化为将块组合在一起的解决方案。

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 multithreading curl python-3.x python-requests

3
推荐指数
1
解决办法
1万
查看次数