我写了一个程序,下载应用程序,电影和其他。但是当我运行它时,给我这个错误:
Traceback (most recent call last):
File "tidopy.py", line 27, in <module>
data=urllib2.urlopen(addresslist[x]).read()
File "C:\Python27\lib\socket.py", line 362, in read
buf.write(data)
MemoryError: out of memory
我认为错误与此代码有关:
data=urllib2.urlopen(addresslist[x]).read()
file=open(namelist[x],'wb')
file.write(data)
数据是一个下载电影和其他
数据的变量文件生成文件
和file.write(data)将数据放入文件
tidopy是我的程序名称..
我该如何解决?
帮助。
答案 0 :(得分:4)
您似乎正在从网址下载文件并将其写入文件,但在此期间您希望data
保存整个文件,这会在计算机的内存(页面文件的RAM)中运行当文件很大时(比如电影)。
解决方案是在下载文件时编写每个文件块,而不是将整个文件加载到内存中,然后再编写它。如果您想使用它,我会有一个小代码:
import requests # just a choice of comfort for me
def download(url_address, filename):
response = requests.get(url_address, stream=True)
response.raise_for_status()
with open(filename, "wb") as f:
total_length = response.headers.get('content-length')
if total_length is None:
f.write(response.content)
else:
total_length = int(total_length)
for data in response.iter_content(chunk_size = total_length / 100):
f.write(data)
如果您注意到,我已设置chunk_size = total_length / 100
,这意味着每次data
中的下载达到1%时,它都会写入该文件,然后将其替换为下一个1%的数据进来,所以它总是需要1%的数据存储在内存中。如果您下载的文件太大而无法处理内存中的1%,则应将chunk_size
替换为固定的字节数,可能为1,000,000(大约为1 MB)