我对Python很陌生,但我非常精通其他语言,所以我至少知道发生了什么。我没有写这段代码,但我正在努力让它符合我的目的。
我使用API来检索上赛季NFL每场比赛的统计数据。我试图将此信息写入CSV文件,到目前为止,它将标题写入文件而不是实际数据。
有人能告诉我我做错了吗?
import csv
import nflgame
games = nflgame.games_gen(2013, kind='REG')
plays = nflgame.combine_plays(games)
headers = []
for statId, info in nflgame.statmap.idmap.iteritems():
headers += info['fields']
headers.sort()
headers = ['gsis_id', 'drive_id', 'play_id', 'desc'] + headers
writer = csv.DictWriter(open('2013_regular_plays.csv', 'w+'), fieldnames=headers)
writer.writerow({k: k for k in headers})
for p in plays:
row = {k: getattr(p, k, 0) for k in headers}
row['gsis_id'] = p.drive.game.eid
row['drive_id'] = p.drive_num
row['play_id'] = p.playid
row['desc'] = p.desc
writer.writerow(row)
答案 0 :(得分:1)
这看起来应该主要起作用。
错误compared to the documentation唯一的细节是文件应该以二进制模式打开(w+b
)。
此外,在查看文件之前关闭文件非常重要:
with open('2013_regular_plays.csv', 'w+b') as csv_file:
writer = csv.DictWriter(csv_file, fieldnames=headers)
…
将在with
块之后自动关闭文件(如果文件未在此块内读取,则文件模式可以更简单wb
)。如果在文件关闭之前查看该文件,其内容可能仍然驻留在RAM而不是磁盘上。
PS :正如DSM指出的那样,当您使用for statId, info in…
(或{{}打开CSV文件时,每次迭代w+
都会清空CSV文件 1}})模式。如果最后一次迭代没有播放,则文件最终为空(仅包含标题)。您通常希望在循环之前打开CSV文件(甚至可能只使用w+b
模式)。