【问题标题】:Importing data from an API and writing answer to a CSV file从 API 导入数据并将答案写入 CSV 文件
【发布时间】:2019-11-17 10:25:30
【问题描述】:

我正在尝试从 API 导入数据,然后将其导出到 CSV 文件中。 但是这不起作用,我收到以下错误:

expected string or buffer. 

我什至尝试使用json.dumps 而不是json.load,我收到以下错误:

<response 200 is not json serializable. 

示例代码:

import requests
from requests.auth import HTTPBasicAuth
import pandas as pd
import json
import csv


proxies = {
    'http': 'http://dummy.restapiexample.com/api/v1/employees
    'https': 'http://dummy.restapiexample.com/api/v1/employees
}

url = 'http://dummy.restapiexample.com/api/v1/employees' 
r = s.get(url=url, proxies=proxies,  auth=HTTPBasicAuth('user', 'pass'))
employee_parsed = json.loads(r) 
emp_data = employee_parsed['Employee ID']
employ_data = open('"Path" testname.csv', 'w') 
csvwriter = csv.writer(employ_data)
count = 0

for emp in emp_data:
      if count == 0:
             header = emp.keys()
             csvwriter.writerow(header)
             count += 1

      csvwriter.writerow(emp.values())

employ_data.close()

有谁知道如何解决发生的错误?任何提示或任何见解或在哪里看/思考都会受到赞赏。谢谢!

【问题讨论】:

  • 我认为您在代理字典中缺少单引号

标签: python json pandas csv request


【解决方案1】:

改变这个:

employee_parsed = json.loads(r)

到这里:

employee_parsed = json.load(r)

查看this 答案,其中谈到了json.loadsjson.load 之间的区别。

编辑:

根据@roganjosh,您可以使用内置的 json 解码器,例如:

r = s.get(url=url, proxies=proxies, auth=HTTPBasicAuth('user', 'pass')).json()

查看描述here

【讨论】:

  • 嗨,谢谢,试过了,但得到错误 'dict' object has no attribut 'read'
  • 假设 r 是您的响应对象,您可以使用 json.load(r)json.loads(r.read())
【解决方案2】:

您的示例代码存在多个问题。我已更正代码以读取 api 并将 csv 作为输出提供。

import requests as s
from requests.auth import HTTPBasicAuth
import pandas as pd
import json
import csv

proxies = {
    'http': 'http://dummy.restapiexample.com/api/v1/employees',
    'https': 'http://dummy.restapiexample.com/api/v1/employees'
}

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
url = 'http://dummy.restapiexample.com/api/v1/employees' #get key

r = s.get(url=url, headers=headers)

employee_parsed = r.json();
emp_data = employee_parsed;

employ_data = open('testname.csv', 'w', encoding="utf-8") 

csvwriter = csv.writer(employ_data)

count = 0

for emp in emp_data:

      if count == 0:

             header = emp.keys()

             csvwriter.writerow(header)

             count += 1

      csvwriter.writerow(emp.values())

employ_data.close()

您可以使用 response.json() 直接获取 json 响应,如我的示例所示。如果您想使用 json.loads 解析响应,那么您只需解析响应的内容。这可以按如下方式完成,

employee_parsed = json.loads(r.content) 

主要问题是使用的 API 没有返回正确的响应,除非用户代理被 Python 欺骗。这可以通过插入欺骗标头来解决。

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
url = 'http://dummy.restapiexample.com/api/v1/employees' #get key

r = s.get(url=url, headers=headers)

我在示例中将请求导入为 s 以确保代码执行。

【讨论】:

  • 嗨,谢谢。尝试了不同的变体,但我得到 Attributterror: 'dict' object has no attribute 'content' 如果我使用 json.loads(r.text) 它是一样的,但是 ..no 属性 'text' 等等,同样的错误
  • @Jordan 如果按原样运行上述代码,则不应出现任何错误。从您指出的错误消息看来, r 是一个 dict 对象。将以下 sn-p 放在您进行调用的语句之后。 print(type(r)) 你应该在控制台中看到类似这样的内容,
【解决方案3】:

您应该从您的回复中提取文本 employee_parsed = json.loads(r.text) 或者只是employee_parsed = r.json()

【讨论】:

    猜你喜欢
    • 2021-05-17
    • 2019-08-06
    • 2011-04-16
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    相关资源
    最近更新 更多