2014-09-07 2 views
0

저는 파이썬에 완전히 익숙하지만, 다른 언어에 익숙해 져서 어떤 일이 벌어지고 있는지 잘 알고 있습니다. 나는이 코드를 작성하지 않았지만 그것이 내 목적을 위해 작동하도록 노력하고있다.파이썬 CSV 파일 작성하기

나는 지난 시즌의 NFL에서 모든 경기에 대한 통계를 검색하기 위해 API을 사용하고 있습니다. 이 정보를 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

@alfasin :'writer'의 정의에 유의하십시오 : 필드 이름을 해석하는 방법을 알고 있습니다. – EOL

답변

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…당신이 w+ (또는 w+b) 모드를 열 때 CSV가 파일 웁니다. 마지막 반복에 재생이 없으면 파일이 비어있게됩니다 (헤더 만 사용). 일반적으로 의 CSV 파일을 열기 전에 루프를 열려고합니다 (wb 모드 일 수도 있음).

+0

+1 파이썬 2에서만'b' 모드가 필요하다는 것을 언급 할 가치가 있습니다. – alfasin

+0

Erm .. 이미 그곳에있는 어떤 것도 파괴하지 않을 것입니까? – DSM

+0

@DSM : 예, 그렇습니다. 'w +'는 파일이 * reading *을 위해 또한 열리라는 것을 의미한다. (w는 쓰기 전용으로 열린다 : 읽기는 "IOError : 읽기 위해 파일이 열리지 않는다"). – EOL