我正在尝试使用Python 2.6和urllib从网上下载(并保存)二进制文件。
据我了解,read(),readline()和readlines()是读取文件类对象的3种方法。 由于二进制文件并没有真正分解为换行符,因此read()和readlines()将整个文件读入内存。
选择随机read()缓冲区大小是在此过程中限制内存使用的最有效方法吗?
即
import urllib
import os
title = 'MyFile'
downloadurl = 'http://somedomain.com/myfile.avi'
webFile = urllib.urlopen(downloadurl)
mydirpath = os.path.join('c:', os.sep,'mydirectory',\
downloadurl.split('/')[-1])
if not os.path.exists(mydirpath):
print "Downloading...%s" % title
localFile = open(mydirpath, 'wb')
data = webFile.read(1000000) #1MB at a time
while data:
localFile.write(data)
data = webFile.read(1000000) #1MB at a time
webFile.close()
localFile.close()
print "Finished downloading: %s" % title
else:
print "%s already exists." % mydirypath
我随意选择了读取(1000000),因为它工作并保持RAM使用率下降。我假设如果我使用原始网络缓冲区选择随机数量会很糟糕,因为如果传输速率太低,缓冲区可能会干涸。但似乎urllib已经为我处理了较低级别的缓冲。
考虑到这一点,选择任意数字是否合适?还有更好的方法吗?
感谢。
答案 0 :(得分:2)
您应该使用urllib.urlretrieve
。它将为您处理一切。
答案 1 :(得分:1)
您应该查看shutil
模块,而不是使用自己的读写循环。 copyfileobj
方法将允许您定义缓冲。最有效的方法因情况而异。即使将相同的源文件复制到同一目的地,也可能因网络问题而有所不同。