Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Steam API:类型错误并将JSON转换为CSV?_Python_Json_Csv - Fatal编程技术网

Python Steam API:类型错误并将JSON转换为CSV?

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 API中提取数据时总是出现类型错误,我试图创建一个字典,然后将其转换为CSV文件,我知道这是JSON文件,所以我的问题有两个,如何创建CSV类型的数据,以及如何将我拥有的JSON信息纳入其中。此方法的思想是获取AppID列表,以便我可以找到它们的价格:

代码:

回溯(最近一次呼叫最后一次):
文件“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
中返回的解析数据创建一个dict
d
。下一行过滤一些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))