Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python请求对(大)文件片段进行流式上载_Python_Python Requests - Fatal编程技术网

使用python请求对(大)文件片段进行流式上载

使用python请求对(大)文件片段进行流式上载,python,python-requests,Python,Python Requests,我需要使用python请求对一个大(多GB)文件的一个片段进行流式上载(即不加载内存中的完整文件部分) 我已经在doc和on-Stack-Overflow中查找过了,但还没有找到一种有效的方法(同样,没有在内存中加载完整的片) 以下是我的代码: 类文件许可证(AbstractContextManager): """ 类似文件的对象,只读取文件的一部分 灵感来源于stackoverflow.com/a/29838711/593036,但实际上很有效。 """ def uu init uuu(sel

我需要使用
python请求
对一个大(多GB)文件的一个片段进行流式上载(即不加载内存中的完整文件部分)

我已经在doc和on-Stack-Overflow中查找过了,但还没有找到一种有效的方法(同样,没有在内存中加载完整的片)

以下是我的代码:

类文件许可证(AbstractContextManager):
"""
类似文件的对象,只读取文件的一部分
灵感来源于stackoverflow.com/a/29838711/593036,但实际上很有效。
"""
def uu init uuu(self,filepath:str,seek_from:int,read_limit:int):
self.filepath=filepath
self.seek_from=seek_from
self.read\u limit=read\u limit
self.n_seen=0
定义输入(自我):
self.f=打开(self.filepath,“rb”)
self.f.seek(self.seek_from)
回归自我
定义(自我):
total_length=os.fstat(self.f.fileno()).st_size
返回最小值(self.read\u limit,总长度-self.seek\u from)
def读取(自,n=-1):
如果self.n\u seen>=self.read\u限制:
返回b“”
剩余金额=self.read\u limit-self.n\u seen
n\u to\u read=如果n<0,剩余的\u数量,否则最小值(n,剩余的\u数量)
self.n_seed+=n_to_read
返回self.f.read(n_至_读取)
定义(自我):
产生自读(n=io.DEFAULT\u BUFFER\u SIZE)
定义退出(自我,*args):
self.f.close()
然后实际请求:

使用FileSlice(filepath,seek\u from=i*chunk\u size,read\u limit=chunk\u size)作为数据:
r=requests.put(预签名的url,数据=数据)
r、 为_状态()提出_
这看起来很复杂,所以我想知道:

  • 如果我错过了一个更简单的方法
  • 如果我的方法是正确的

谢谢大家!

很抱歉我的第一句话。你已经按照我的建议做了。Doh!-我猜你看到的是正确的方法。然而,我希望网络上已经有一个实用程序类,已经编写并测试过了,可以做到这一点这看起来并不复杂。你试过这个密码吗?还不起作用,是吗?我觉得不错,你可以用
请求流式传输它。put(url,data=open(file,'rb'))
?我的印象是这将在内部缓冲。@erip是的,但我需要一个部分切片,而不是整个文件。