尝试在 CSV 文件中写入行时,Python“列表”对象没有属性“键”

God*_*yer 2 python csv json pandas

我正在尝试将新行写入 CSV 文件,但不能,因为我在 Python Shell 中收到错误。

下面是我正在使用的代码(我正在从 API 读取 JSON 并希望将数据放入 CSV 文件中)

# import urllib library
from urllib.request import Request, urlopen
c=1
# import json
import json
# store the URL in url as 
# parameter for urlopen
import pandas as pd
import csv
headerList = ['name','id','order','height','weight','speed','special_defense','special_attack','defense','attack','hp']
  
# open CSV file and assign header
with open("pokemon_stats.csv", 'w') as file:
    dw = csv.DictWriter(file, delimiter=',', 
                        fieldnames=headerList)
    dw.writeheader()
  
# display csv file
fileContent = pd.read_csv("pokemon_stats.csv")
for r in range(1,3):
    req = Request('https://pokeapi.co/api/v2/pokemon/'+str(r)+'/', headers={'User-Agent': 'Chrome/32.0.1667.0'})
  
# store the response of URL
    response = urlopen(req)

# storing the JSON response 
# from url in data
    data_json = json.loads(response.read())

#print(data_json)

    for key, value in data_json.items():
        if key=='name':
            name=value
        elif key=='id':
            id=value
        elif key=='order':
            order=value
        elif key=='height':
            height=value
        elif key=='weight':
            weight=value
        elif key == 'stats':
            for sub in data_json['stats']:
                for i in sub:
                    if i=='base_stat':
                        base_stat=sub[i]
                    if i=='stat':
                        for j in sub[i]:
                            if j=='name':
                                stat_name=sub[i][j]
                                if stat_name=='hp':
                                    hp=base_stat
                                elif stat_name=='attack':
                                    attack=base_stat
                                elif stat_name=='defense':
                                    defense=base_stat
                                elif stat_name=='special-attack':
                                    special_attack=base_stat
                                elif stat_name=='special-defense':
                                    special_defense=base_stat
                                elif stat_name=='speed':
                                    speed=base_stat
    data = [name,id,order,height,weight,speed,special_defense,special_attack,defense,attack,hp]
    dw.writerow(data)
Run Code Online (Sandbox Code Playgroud)

在我尝试执行此代码后,出现如下错误:

Traceback (most recent call last):
  File "C:/Users/sbelcic/Desktop/NANOBIT_API.py", line 117, in <module>
    dw.writerow(data)
  File "C:\Users\sbelcic\AppData\Local\Programs\Python\Python37\lib\csv.py", line 155, in writerow
    return self.writer.writerow(self._dict_to_list(rowdict))
  File "C:\Users\sbelcic\AppData\Local\Programs\Python\Python37\lib\csv.py", line 148, in _dict_to_list
    wrong_fields = rowdict.keys() - self.fieldnames
AttributeError: 'list' object has no attribute 'keys'*
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙并告诉我我做错了什么吗?

我没有使用 Python 操作 JSON 响应的工作经验,因此欢迎任何评论。如果有人看到更好的方法,欢迎分享。

小智 5

由于 dw 是 a DictionaryWriter,因此 data 需要是一个字典(当前是一个列表),如文档中所示。

使用标题将数据转换为字典

data = [name,id,order,height,weight,speed,special_defense,special_attack,defense,attack,hp]
data = dict(zip(headerList, data))
dw.writerow(data)
Run Code Online (Sandbox Code Playgroud)