Python Steam API:类型错误并将JSON转换为CSV?
我试图弄清楚为什么我在尝试从Steam API中提取数据时总是出现类型错误,我试图创建一个字典,然后将其转换为CSV文件,我知道这是JSON文件,所以我的问题有两个,如何创建CSV类型的数据,以及如何将我拥有的JSON信息纳入其中。此方法的思想是获取AppID列表,以便我可以找到它们的价格: 代码:Python Steam API:类型错误并将JSON转换为CSV?,python,json,csv,Python,Json,Csv,我试图弄清楚为什么我在尝试从Steam API中提取数据时总是出现类型错误,我试图创建一个字典,然后将其转换为CSV文件,我知道这是JSON文件,所以我的问题有两个,如何创建CSV类型的数据,以及如何将我拥有的JSON信息纳入其中。此方法的思想是获取AppID列表,以便我可以找到它们的价格: 代码: 回溯(最近一次呼叫最后一次): 文件“steam.py”,第46行,在 打印蒸汽库拉动(76561197960434622,键) steamlibrarypull中第44行的文件“steam.py”
回溯(最近一次呼叫最后一次):
文件“steam.py”,第46行,在
打印蒸汽库拉动(76561197960434622,键)
steamlibrarypull中第44行的文件“steam.py”
B[I['name']=I['appid']
TypeError:列表索引必须是整数,而不是str
您的for
循环没有执行您希望它执行的操作。使用以下命令:
for game in I:
B[game['name']] = game['appid']
return B
I
在本例中(我假设,因为我没有Steam帐户),是一个包含大量dict的列表,每个dict都有一个'name'
字段和一个'appid'
字段。您的for
循环正在迭代这些dict中的每一个,您只想将这两个字段存储在名为B
的新dict中。但是,在您的代码中,I['name']
不起作用,因为I
是一个列表,只能由整数索引,因此会出现错误。然而,当迭代这个dict列表时,game['name']
会很好地工作,因为dict是由它们的键索引的
至于将这些数据转换为CSV,在这个主题上有很多问题,所以只需使用Google搜索它们。您没有正确引用迭代器
def steamlibrarypull(steamID, key):
#Pulls out a CSV of Steam libraries
steaminfo = {
'key': key,
'steamid': steamID,
'format':'JSON',
'include_appinfo':'1'
}
r = requests.get('http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/', params=steaminfo)
d = json.loads(r.content)
I = d['response']['games']
B = {}
for games in I:
B[games['name']] = games['appid']
return B
这将返回一个名为appid的字典。然后需要对其进行迭代并将其写入文件
with open('games.csv', 'w') as f:
for key, value in B.items():
f.write("%s,%s\r\n" % (key, value))
仅供参考,
请求
对象有一个返回Python指令的json()
方法。还有一个编码提示:使用有意义的变量名。你不是在一个有64K内存的芯片上写汇编程序——要有描述性。一年后,当你回到代码中时,你会感谢自己,这样你就不会被任何想使用你的代码的人杀死。尽管如此,我只想从请求中获取Json的特定部分。获取。我理解这一点。我的意思是,您可以将d=json.load(r.content)
替换为d=r.json()
,而不必担心导入json
模块。见鬼,你甚至可以使用I=r.json()['response']['games']
跳过几行。此外,你可以提问并发布错误的完整文本?虽然这很好,但有没有办法不将其放入单独的文件中?我找不到一个做不到的。理想情况下,我想把它放入一个变量中,这样我就可以调用它来获取价格。@Marorin你说的是什么“文件”?“我想把它放到一个变量中,这样我就可以调用它来获取价格。”你在说什么“它”<代码>B是一个变量。如果您有一款名为FUBAR
的游戏,其应用程序id为12345
,则print(B['FUBAR'))
将为您提供应用程序id。我不确定您的确切要求。我希望能够创建CSV数据,但不会将其输出到单独的文件中。比如如何解析GET请求中的JSON,然后将其输入字典。@Marorin我的答案中没有单独的文件。正如我在上面的评论中所说,d=r.json()
使用r
中返回的解析数据创建一个dictd
。下一行过滤一些dict并将结果存储在I
中。最后,我的代码再过滤一些,并将所有内容存储在B
dict中。根本不输出到文件。如果您需要帮助将DICT转换为CSV,只需搜索,因为有大量的资源。我想一个更大的问题是:您最终要做什么?CSV的作用是什么?虽然它起作用:我现在得到了这个错误:UnicodeEncodeError:“ascii”编解码器无法对位置19中的字符u'\u2122'进行编码:序号不在范围内(128)是的,steams api响应是utf-8格式的,需要编码为utf-8,然后才能在python中使用它。你可以这样理解字典:encodeddict={k.encode('utf8'):v代表k,v代表B.items()}
或B[games['name'].encode('utf8')]=games['appid']
。如果您打算在python中使用steam api,您需要尽早转换为utf-8,因为游戏名和用户名中通常有一个utf-8字符。下面是我正在使用的steam api包装的一个示例。这可能会帮助你开始。请记住,我仍在努力解决这个问题,很可能会清理它以提高效率。B[games['name'].encode('utf8')]=games['appid']是放置它的最佳位置。
def steamlibrarypull(steamID, key):
#Pulls out a CSV of Steam libraries
steaminfo = {
'key': key,
'steamid': steamID,
'format':'JSON',
'include_appinfo':'1'
}
r = requests.get('http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/', params=steaminfo)
d = json.loads(r.content)
I = d['response']['games']
B = {}
for games in I:
B[games['name']] = games['appid']
return B
with open('games.csv', 'w') as f:
for key, value in B.items():
f.write("%s,%s\r\n" % (key, value))