我正在使用PyCurl,范围http标头和Python线程,因此,如果我需要下载1 gb文件并想要使用例如与服务器的5条连接来加快处理速度,我只将1 gb分为五个部分,并且创建五个线程,每个线程下载1/5,然后将1/5保存到“ .part”文件中,当5个线程全部完成并下载其1/5文件时,我只需加入所有部分并重新创建1 gb文件。我的问题是...。我该如何以相同的5个块下载文件,而不是将每个块保存到临时文件中,然后将所有文件加入原始文件中,只需下载5个部分并将这些部分保存到直接一个1gb文件?这可能吗?
因此,正如我们在评论中所讨论的,您不能really做您想做的事情。不过,我有几个想法可能会对您有所帮助。
如果知道要下载的文件大小,则可以创建所需大小的文件,并用下载的字节覆盖。
with open("some_file_name", "wb") as f:
f.truncate(some_size)
或
with open("some_file_name", "wb") as f:
f.seek(some_size - 1)
f.write('\0')
请注意,如果指定的大小超过文件的当前大小,则结果取决于平台:可能的情况包括文件可能保持不变,增大为指定大小(好像是零填充的)或增大为指定的大小,未定义的新内容。
因此,当您下载部分时,您可以使用]覆盖特定的字节块>
with open("some_file_name", "r+b") as f: f.seek(offset) f.write(data_chunk)
选项2
决定了您愿意使用多少内存,一次只能下载一定数量的部件。
示例:如果您确定只想使用1GB,并且要以250 MB的块大小下载一个大文件,则该文件
写入临时文件(如您在原始问题中提到的那样,但将其保存在用户可能看不到它们的位置,例如系统的temp目录或程序创建的隐藏目录中)
至少在UNIX / Linux系统上,您应该能够轻松地做到这一点。关键是您应该在线程1中创建一次文件,然后将其打开以进行写入。然后,您需要再次re-open