当前位置:嗨网首页>书籍在线阅读

10-将下载的文件保存到硬盘

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

12.3 将下载的文件保存到硬盘

现在,可以用标准的 open() 函数和 write() 方法,将Web页面保存到硬盘中的一个文件。但是,这里讲的方法稍稍有一点不同。首先,必须用“写二进制”模式打开该文件,即向函数传入字符串 'wb' 作为 open() 的第二参数。即使该页面是纯文本的,你也需要写入二进制数据,而不是文本数据,目的是保存该文本中的“Unicode编码”。

为了将Web页面写入一个文件,可以使用 for 循环和 Response 对象的 iter_content() 方法。

>>> import requests
>>> res = requests.get('https://auto/files/rj.txt')
>>> res.raise_for_status()
>>> playFile = open('RomeoAndJuliet.txt', 'wb')
>>> for chunk in res.iter_content(100000): 
 playFile.write(chunk)
100000
78981
>>> playFile.close()

Unicode编码

Unicode编码超出了本书的范围,你可以自行查找以下文章来了解更多的相关内容。

  • Joel on Software:“The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)”。
  • Ned Batchelder:“Pragmatic Unicode”。

iter_content() 方法在循环的每次迭代中返回一段内容,每一段都是bytes数据类型,你需要指定一段包含多少字节。100 000字节通常是不错的选择,所以将“100 000”作为参数传递给 iter_content()

文件RomeoAndJuliet.txt将存在于当前工作目录。请注意,虽然在网站上文件名是pg1112.txt,但在你的硬盘上,该文件的名字不同。 requests 模块只处理下载的网页内容。一旦网页下载后,它就只是程序中的数据。即使在下载该网页后断开了因特网连接,该页面的所有数据仍然会在你的计算机中。

write() 方法返回一个数字,表示写入文件的字节数。在前面的例子中,第一段包含100 000字节,文件剩下的部分只需要78 981字节。

回顾一下,下载并保存到文件的完整过程如下。

1.调用 requests.get() 下载该文件。

2.用 'wb' 调用 open() ,以写二进制的方式打开一个新文件。

3.利用 Response 对象的 iter_content() 方法做循环。

4.在每次迭代中调用 write() ,将内容写入该文件。

5.调用 close() 关闭该文件。

这就是关于 requests 模块的全部内容。相对于写入文本文件的 open()/ write()/close() 工作步骤, for 循环和 iter_content() 的部分可能看起来比较复杂,但这是为了确保 requests 模块即使下载巨大的文件也不会消耗太多内存。