用Python写入CSV文件

时间:2014-09-07 01:48:00

标签: python csv

我对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)

1 个答案:

答案 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模式)。