Python基础知识 - 从API请求数据并写入文件

时间:2016-02-15 19:47:09

标签: python file-io

我正在尝试使用“请求”包并从Github检索信息,就像请求文档页面解释:

import requests
r = requests.get('https://api.github.com/events')

而且:

with open(filename, 'wb') as fd:
    for chunk in r.iter_content(chunk_size):
        fd.write(chunk)

我不得不说我不理解第二个代码块。

  • filename - 如果创建文件,我以什么形式提供文件的路径?如果没有,它会在哪里保存?
  • 'wb' - 这个变量是什么? (第二个参数不应该是'模式'吗?)
  • 以下两行可能会迭代使用请求检索的数据并写入文件

Python文档解释也没有多大帮助。

编辑:我想做的事情:

  • 使用请求连接到API(Github和后来的Facebook GraphAPI)
  • 将数据检索到变量
  • 将此文件写入文件(稍后,当我更熟悉Python时,将其写入我的本地MySQL数据库)

2 个答案:

答案 0 :(得分:4)

文件名

使用open时,路径相对于当前目录。因此,如果你说open('file.txt','w')它将在你的python脚本所在的任何文件夹中创建一个名为file.txt的新文件。你也可以指定一个绝对路径,例如linux中的/home/user/file.txt。如果名称为'file.txt'的文件已存在,则内容将被完全覆盖。

模式

'wb'选项确实是模式。 'w'表示写入,'b'表示字节。当您想要编写(而不是读取)文件时使用'w',并使用'b'作为二进制文件(而不是文本文件)。在这种情况下使用'b'实际上有点奇怪,因为您正在编写的内容是文本文件。指定'w'在这里也可以正常工作。详细了解docs for open中的模式。

The Loop

此部分使用iter_content中的requests方法,该方法适用于您可能不想在内存中同时使用的大型文件。在这种情况下,这是不必要的,因为有问题的页面只有89 KB。有关详细信息,请参阅requests library docs

结论

您正在查看的示例旨在处理最常见的情况,其中远程文件可能是二进制文件,而且太大而无法在内存中。但是,如果您只访问包含文本的小型网页,我们可以使您的代码更易读且易于理解:

import requests
r = requests.get('https://api.github.com/events')

with open('events.txt','w') as fd:
    fd.write(r.text)

答案 1 :(得分:2)

filename = 'example.html'是您要将其保存的路径的字符串。它接受本地路径或绝对路径,因此您只能拥有wb

WRITE代表BYTES& # just W becase we are not writing as bytes anymore, just text. with open(filename, 'w') as fd: fd.write(r.content) ,了解详情documentation

for循环遍历整个返回的内容(以块为单位,因为它太大而无法进行正确的内存处理),然后将它们写入,直到不再有内容为止。适用于大型文件,但对于单个网页,您可以这样做:

Insert into yourtable(id, Part, Seq, Model)
    Select 6, 'Groin', ISNULL(max(Seq),0) + 1, 3 
    From yourtable
    where MODEL = 3;