如何在不将整个文件读入内存的情况下,用python 3从internet上编写一个大型二进制文件?

如何在不将整个文件读入内存的情况下,用python 3从internet上编写一个大型二进制文件?,python,Python,提供了一种非常有用的方法,可以使用Python 3从internet下载文件 基本上它说要使用: with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file: shutil.copyfileobj(response, out_file) 如果url指定了一个大文件,那么响应是否会自动存储在内存中?也就是说,即使copyfileobj缓冲文件,也不仅仅是让请求以response的形式返回整

提供了一种非常有用的方法,可以使用Python 3从internet下载文件

基本上它说要使用:

with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
    shutil.copyfileobj(response, out_file)

如果
url
指定了一个大文件,那么
响应是否会自动存储在内存中?也就是说,即使
copyfileobj
缓冲文件,也不仅仅是让请求以
response
的形式返回整个大文件?

否,
urlopen
将通过套接字返回类似文件的对象。引述:

打开由URL表示的网络对象进行读取。如果URL没有 有一个方案标识符,或者如果它有file:作为其方案标识符, 这将打开一个本地文件(没有通用换行符);否则它 打开网络某处服务器的套接字。如果连接 无法使IOError异常被引发。如果一切顺利,一个 返回类似文件的对象。这支持以下方法: read()、readline()、readlines()、fileno()、close()、info()、getcode()和geturl()


因此,由于urlopen也不支持
seek
方法,但
copyfileobj
也不支持该方法,因此我们可以推断,不需要将所有内容存储在内存中。

“顺便说一句,不仅仅是让请求以
response
的形式返回整个大文件,您还可以问类似的问题。”“用open(“bigfile.txt”,“r”)作为响应调用
,不将整个大文件作为
响应读入内存吗?”这个问题的答案也是“否”,并且在某些方面与来自
urllib
的响应对象的情况类似,在其他方面不同。值得更详细地了解不同类型的I/O是如何工作的。因此
seek
只能在内存中的对象上使用,如果它不可用,是否比不在内存中的对象更有效?正如@SteveJessop在他对我的问题的评论中提到的,我可以用open(“bigfile.txt”,“r”)
四处搜索
,而不将其全部读取到内存中。不?在真实文件中搜索不会将其全部读取到内存中。我的意思是不用seek,就可以使用类似文件的对象进行流式处理。而且,当您对内容进行流式处理时,并没有充分的理由将其全部存储在内存中,只需对其进行缓冲即可。