2016-02-16 15 views
2

我正在尝试构建一个数据库,其中包含玩游戏数据的数个赛季的NBA比赛,对于我的Msc。在经济学论文。目前,我提取NBA的API(see example)和分裂每场比赛场比赛使用this routine不同以.json文件(正式适用于PBP目的),从而产生以.json文件,(第一个玩的例子):按照特定的.json转换NBA比赛为.csv

{"headers": ["GAME_ID", "EVENTNUM", "EVENTMSGTYPE", "EVENTMSGACTIONTYPE", "PERIOD", "WCTIMESTRING", "PCTIMESTRING", "HOMEDESCRIPTION", "NEUTRALDESCRIPTION", "VISITORDESCRIPTION", "SCORE", "SCOREMARGIN"], "rowSet": [["0041400406", 0, 12, 0, 1, "9:11 PM", "12:00", null, null, null, null, null], ["0041400406", 1, 10, 0, 1, "9:11 PM", "12:00", "Jump Ball Mozgov vs. Green: Tip to Barnes", null, null, null, null] 

我计划在创建一个循环将所有生成的.json文件转换为.csv,这样它就可以进行stata中的计量经济学分析。目前,我陷入了这个过程的第一步:创建json到CSV转换过程(之后我将设计循环)。我想的代码是:

f = open('pbp_0041400406.json') 
data = json.load(f) 
f.close() 

with open("pbp_0041400406.csv", "w") as file: 
    csv_file = csv.writer(file) 

    for rowSet in data: 
     csv_file.writerow(rowSet) 

f.close() 

然而,产生CSV文件显示尴尬的结果:一个线读取h,e,a,d,e,r,s和其他阅读r,o,w,S,e,t,因此不会捕捉标题或行集(戏剧本身)。

我试图解决这个问题,考虑到贡献on this thread,但我一直无法做到这一点。任何人都可以提供一些解决这个问题的见解吗?

[编辑]用原始代码中的数据替换行集也取得了相同的结果。

在此先感谢!

+0

嗨@SNygard,谢谢你的提示。我打印rowSet,它的名字没有定义。打印数据后,原始的.json文件确实显示在外壳上。但是,在替换原始代码中的rowset数据之后,返回的.csv获得与以前相同的结果。 –

+2

考虑到示例JSON,'data'将会是一个[dict](https://docs.python.org/2/tutorial/datastructures.html#dictionaries),带有两个键'headers'和'rowSet'。因此,循环访问行需要用于数据行['rowSet']'。 –

回答

-1

问题解决了!使用@MaxU代码和先前构建的包含所有gameid的.CSV,从01-02赛季开始的每个nba游戏都可以通过.JSON直接抓取并使用以下代码转换为CSV:(Credits for @MaxU)

from __future__ import print_function 

import json 
import csv 
import requests 

u_a = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36" 
url_pattern = "http://stats.nba.com/stats/playbyplayv2?GameID=%(GameID)s&StartPeriod=%(StartPeriod)s&EndPeriod=%(EndPeriod)s&tabView=%(tabView)s" 


def write_csv(game_id, resultSet): 
fn = resultSet['name'] + '_' + str(game_id) + '.csv' 
# ignore unimportant resultsets ... 
if resultSet['name'] not in ['PlayByPlay', 'PlayBlahBlah']: 
    return 
with open(fn, 'w') as fout: 
    csv_file = csv.writer(fout, quotechar='"') 

    csv_file.writerow(resultSet['headers']) 

    for rowSet in resultSet['rowSet']: 
     csv_file.writerow(rowSet) 

def process_game_id(game_id, tabView='playbyplay', 
       start_period='0', end_period='0'): 
url_parms = { 
    'GameID': game_id, 
    'StartPeriod': start_period, 
    'EndPeriod': end_period, 
    'tabView': tabView, 
} 

r = requests.get((url_pattern % url_parms), headers={"USER-AGENT":u_a}) 

if r.status_code == requests.codes.ok: 
    data = json.loads(r.text) 

    for rset in data['resultSets']: 
     write_csv(url_parms['GameID'], rset) 
else: 
    r.raise_for_status() 


if __name__ == '__main__': 
# 
# assuming that the 'games.csv' file contains all Game_IDs ... 
# 
with open('games.csv', 'r') as f: 
    csv_reader = csv.reader(f, delimiter=',') 
    for row in csv_reader: 
     process_game_id(row[<column_num_containing_Game_ID>]) 

对这个数据有任何进一步的问题,PLZ做PM我。快乐编码每个人!

2

试试这个:

import json 
import csv 

with open('json.json') as f: 
    data = json.load(f) 


with open("pbp_0041400406.csv", "w") as fout: 
    csv_file = csv.writer(fout, quotechar='"') 

    csv_file.writerow(data['headers']) 

    for rowSet in data['rowSet']: 
     csv_file.writerow(rowSet) 

得到的CSV:

GAME_ID,EVENTNUM,EVENTMSGTYPE,EVENTMSGACTIONTYPE,PERIOD,WCTIMESTRING,PCTIMESTRING,HOMEDESCRIPTION,NEUTRALDESCRIPTION,VISITORDESCRIPTION,SCORE,SCOREMARGIN 

0041400406,0,12,0,1,9:11 PM,12:00,,,,, 

0041400406,1,10,0,1,9:11 PM,12:00,Jump Ball Mozgov vs. Green: Tip to Barnes,,,, 
+0

Hi @MaxU,谢谢你的回复!我试图重复它,并且我成功地制作了我正在寻找的.CSV文件。但是,现在我正在努力解决另一个问题,因为我需要将此代码循环到同一目录中的多个文件。 这个想法是运行一些相同的确切代码。JSON文件在同一路径中,而不管它们的名称/顺序/等等。 我已经尝试了一些解决方法,使用'while'和'for'代码创建对象,但迄今为止失败。你对这个问题有什么建议吗? –

+0

你见过我的第二个回答:http://stackoverflow.com/a/35445623/5741205 – MaxU

1

我想你可能已经作出关于JSON输入的结构是错误的。顶层有三个键。 resultSets - >列表,其第一个元素是具有键“rowSet”的字典。这就是我想你想要迭代的。

f = open('playbyplay', 'r') 
data = json.load(f) 
f.close() 
print data.keys() 
rows = data['resultSets'][0]['rowSet'] 

with open("pbp_0041400406.csv", "w") as file: 
    csv_file = csv.writer(file) 
    for rowSet in rows: 
     csv_file.writerow(rowSet) 

输出数据:

0041300402,0,12,0,1,8:13 PM,12:00,,,,,,0,0,,,,,,0,0,,,,,,0,0,,,,, 
0041300402,1,10,0,1,8:13 PM,12:00,Jump Ball Duncan vs. Bosh: Tip to Wade,,,,,4,1495,Tim Duncan,1610612759,San Antonio,Spurs,SAS,5,2547,Chris Bosh,1610612748,Miami,Heat,MIA,5,2548,Dwyane Wade,1610612748,Miami,Heat,MIA 
0041300402,2,5,2,1,8:13 PM,11:45,Green STEAL (1 STL),,James Lost Ball Turnover (P1.T1),,,5,2544,LeBron James,1610612748,Miami,Heat,MIA,4,201980,Danny Green,1610612759,San Antonio,Spurs,SAS,0,0,,,,, 
0041300402,3,1,1,1,8:14 PM,11:26,Green 18' Jump Shot (2 PTS) (Splitter 1 AST),,,0 - 2,2,4,201980,Danny Green,1610612759,San Antonio,Spurs,SAS,4,201168,Tiago Splitter,1610612759,San Antonio,Spurs,SAS,0,0,,,,, 
0041300402,4,6,2,1,8:14 PM,11:03,Green S.FOUL (P1.T1),,,,,4,201980,Danny Green,1610612759,San Antonio,Spurs,SAS,5,1740,Rashard Lewis,1610612748,Miami,Heat,MIA,1,0,,,,, 
0041300402,5,3,11,1,8:14 PM,11:03,,,Lewis Free Throw 1 of 2 (1 PTS),1 - 2,1,5,1740,Rashard Lewis,1610612748,Miami,Heat,MIA,0,0,,,,,,0,0,,,,, 
0041300402,7,3,12,1,8:14 PM,11:03,,,MISS Lewis Free Throw 2 of 2,,,5,1740,Rashard Lewis,1610612748,Miami,Heat,MIA,0,0,,,,,,0,0,,,,, 
0041300402,9,4,0,1,8:15 PM,11:01,Splitter REBOUND (Off:0 Def:1),,,,,4,201168,Tiago Splitter,1610612759,San Antonio,Spurs,SAS,0,0,,,,,,0,0,,,,, 
0041300402,10,1,5,1,8:15 PM,10:52,Duncan 1' Layup (2 PTS) (Parker 1 AST),,,1 - 4,3,4,1495,Tim Duncan,1610612759,San Antonio,Spurs,SAS,4,2225,Tony Parker,1610612759,San Antonio,Spurs,SAS,0,0,,,,, 
+0

嗨@MaxU,谢谢你的回复!我试图重复它,并且我成功地生成了我正在查找的.CSV文件,但只有当我使用原始.json提要时。但是,现在我正在努力解决另一个问题,因为我需要将此代码循环到同一目录中的多个文件。这个想法是在相同路径上的许多.JSON文件上运行相同的确切代码,而不考虑它们的名称/顺序等。我已经尝试了一些解决方法,使用'while'和'for'代码创建对象,但迄今为止失败。你对这个问题有什么建议吗? –