2017-12-20 37 views
1

私はいくつかのスクリプトを組み合わせて問題を抱えています。私は別の場所にwriter.writerowを配置しようとしましたが、アイディアが足りなくなりました。出力から見ることができるように、最後のループをループし、3番目が完了するまで最初の2つのループを2番目のループに移動するよりも繰り返します。見ていただきありがとうございます!複数のリクエストを1つのCsvにPythonで書き込む

import csv 
import requests 
import os 

outfile = open("NHL_Home_Skater.csv","a",newline='') 
writer = csv.writer(outfile) 
writer.writerow(["Date","Player","PlayerId","Pos","TM","Opp","GameId","GP","G","A","Points","Shots","Spctg","PPG","PPP","SHG","SHP","TOI","Shifts","PIM","Player","GameId","BS","Give Aways","Take Aways","Missed Shots","Player","GameId","EvTOI","PpTOI","ShTOI"]) 

req = requests.get('http://www.nhl.com/stats/rest/skaters?isAggregate=false&reportType=basic&isGame=true&reportName=skatersummary&sort=[{%22property%22:%22playerName%22,%22direction%22:%22ASC%22}]&factCayenneExp=gamesPlayed%3E=1&cayenneExp=gameDate%3E=%222017-10-04%22%20and%20gameDate%3C=%222017-12-31%22%20and%20gameTypeId=2%20and%20gameLocationCode=%22H%22') 
data = req.json()['data'] 
for item in data: 
    Player = item['playerName'] 
    date = item['gameDate'] 
    Pos = item['playerPositionCode'] 
    TM = item['teamAbbrev'] 
    Opp = item['opponentTeamAbbrev'] 
    GameId = item['gameId'] 
    GP = item['gamesPlayed'] 
    G = item['goals'] 
    A = item['assists'] 
    Shots = item['shots'] 
    PIM = item['penaltyMinutes'] 
    PlayerId = item['playerId'] 
    Points = item['points'] 
    PPG = item['ppGoals'] 
    PPP = item['ppPoints'] 
    SHG = item['shGoals'] 
    SHP = item['shPoints'] 
    Shifts = item['shiftsPerGame'] 
    Spctg = item['shootingPctg'] 
    TOI = item['timeOnIcePerGame'] 

    writer.writerow([date,Player,PlayerId,Pos,TM,Opp,GameId,GP,G,A,Points,Shots,Spctg,PPG,PPP,SHG,SHP,TOI,Shifts,PIM]) 

    req2 = requests.get('http://www.nhl.com/stats/rest/skaters?isAggregate=false&reportType=basic&isGame=true&reportName=realtime&sort=[{%22property%22:%22playerName%22,%22direction%22:%22ASC%22}]&factCayenneExp=gamesPlayed%3E=1&cayenneExp=gameDate%3E=%222017-10-04%22%20and%20gameDate%3C=%222017-12-31%22%20and%20gameTypeId=2%20and%20gameLocationCode=%22H%22') 
    data2 = req2.json()['data'] 
    for item in data2: 
     Player2 = item['playerName'] 
     GameId2 = item['gameId'] 
     BS = item['blockedShots'] 
     GiveAways = item['giveaways'] 
     TakeAways = item['takeaways'] 
     MissedShots = item['missedShots'] 

     writer.writerow([Player,GameId,BS,GiveAways,TakeAways,MissedShots]) 

     req3 = requests.get('http://www.nhl.com/stats/rest/skaters?isAggregate=false&reportType=basic&isGame=true&reportName=timeonice&sort=[{%22property%22:%22playerName%22,%22direction%22:%22ASC%22}]&factCayenneExp=gamesPlayed%3E=1&cayenneExp=gameDate%3E=%222017-10-04%22%20and%20gameDate%3C=%222017-12-31%22%20and%20gameTypeId=2%20and%20gameLocationCode=%22H%22') 
     data3 = req3.json()['data'] 
     for item in data3: 
      Player3 = item['playerName'] 
      GameId3 = item['gameId'] 
      EvTOI = item['evTimeOnIce'] 
      PpTOI = item['ppTimeOnIce'] 
      ShTOI = item['shTimeOnIce'] 

      writer.writerow([Player, GameId, EvTOI, PpTOI, ShTOI]) 
outfile.close() 

出力リレー:

2017-10-28T23:00:00Z A.J. Greer 8478421 L COL CHI 2017020165 1 0 0 0 0 0.0 0 0 0 0 373.0 10.0 2 A.J. Greer 2017020165 0 0 1 0 A.J. Greer 2017020165 373 0 0 
2017-10-28T23:00:00Z A.J. Greer 8478421 L COL CHI 2017020165 1 0 0 0 0 0.0 0 0 0 0 373.0 10.0 2 A.J. Greer 2017020165 0 0 1 0 A.J. Greer 2017020194 486 0 0 
2017-10-28T23:00:00Z A.J. Greer 8478421 L COL CHI 2017020165 1 0 0 0 0 0.0 0 0 0 0 373.0 10.0 2 A.J. Greer 2017020165 0 0 1 0 A.J. Greer 2017020134 498 4 0 
2017-10-28T23:00:00Z A.J. Greer 8478421 L COL CHI 2017020165 1 0 0 0 0 0.0 0 0 0 0 373.0 10.0 2 A.J. Greer 2017020165 0 0 1 0 Aaron Ekblad 2017020190 1035 88 126 

新しい出力:

Date Player PlayerId Pos TM Opp GameId GP G A Points Shots Spctg PPG PPP SHG SHP TOI Shifts PIM 

2017-11-02T23:00:00Z A.J. Greer 8478421 L COL CAR 2017020194 1 0 1 1 0 0 0 0 0 0 486 12 0 

2017-10-28T23:00:00Z A.J. Greer 8478421 L COL CHI 2017020165 1 0 0 0 0 0 0 0 0 0 373 10 2 

2017-10-24T23:00:00Z A.J. Greer 8478421 L COL DAL 2017020134 1 0 0 0 2 0 0 0 0 0 502 13 0 

答えて

1

この問題は複雑で難しいものではなく、データ量が大きいため(ほぼ10,000行のデータ)、各行には約30+個の列があります。あなたのコードを読んだ後、私はあなたがあなたの出力のために欲しいものを理解していると信じています。ここに私の試みは次のとおりです。

import csv 
import os 
import requests 

outfile = open("NHL_Home_Skater.csv", 'a', newline='') 
writer = csv.writer(outfile) 
header=[ 
    "Date","Player","PlayerId","Pos","TM", 
    "Opp","GameId","GP","G","A", 
    "Points","Shots","Spctg","PPG","PPP", 
    "SHG","SHP","TOI", "Shifts", "PIM", 

    "Player2","GameId","BS","Give Aways","Take Aways", "Missed Shots", 
    "Player3","GameId","EvTOI","PpTOI","ShTOI"] 
writer.writerow(header) 

req = requests.get('http://www.nhl.com/stats/rest/skaters?isAggregate=false&reportType=basic&isGame=true&reportName=skatersummary&sort=[{%22property%22:%22playerName%22,%22direction%22:%22ASC%22}]&factCayenneExp=gamesPlayed%3E=1&cayenneExp=gameDate%3E=%222017-10-04%22%20and%20gameDate%3C=%222017-12-31%22%20and%20gameTypeId=2%20and%20gameLocationCode=%22H%22') 
data = req.json()['data'] 

req2 = requests.get('http://www.nhl.com/stats/rest/skaters?isAggregate=false&reportType=basic&isGame=true&reportName=realtime&sort=[{%22property%22:%22playerName%22,%22direction%22:%22ASC%22}]&factCayenneExp=gamesPlayed%3E=1&cayenneExp=gameDate%3E=%222017-10-04%22%20and%20gameDate%3C=%222017-12-31%22%20and%20gameTypeId=2%20and%20gameLocationCode=%22H%22') 
data2 = req2.json()['data'] 

req3 = requests.get('http://www.nhl.com/stats/rest/skaters?isAggregate=false&reportType=basic&isGame=true&reportName=timeonice&sort=[{%22property%22:%22playerName%22,%22direction%22:%22ASC%22}]&factCayenneExp=gamesPlayed%3E=1&cayenneExp=gameDate%3E=%222017-10-04%22%20and%20gameDate%3C=%222017-12-31%22%20and%20gameTypeId=2%20and%20gameLocationCode=%22H%22') 
data3 = req3.json()['data'] 

for item, item2, item3 in zip(data, data2, data3): 
    row = (
     item['gameDate'], 
     item['playerName'], 
     item['playerId'], 
     item['playerPositionCode'], 
     item['teamAbbrev'], 
     item['opponentTeamAbbrev'], 
     item['gameId'], 
     item['gamesPlayed'], 
     item['goals'], 
     item['assists'], 
     item['points'], 
     item['shots'], 
     item['shootingPctg'], 
     item['ppGoals'], 
     item['ppPoints'], 
     item['shGoals'], 
     item['shPoints'], 
     item['timeOnIcePerGame'], 
     item['shiftsPerGame'], 
     item['penaltyMinutes'], 

     item2['playerName'], 
     item2['gameId'], 
     item2['blockedShots'], 
     item2['giveaways'], 
     item2['takeaways'], 
     item2['missedShots'], 

     item3['playerName'], 
     item3['gameId'], 
     item3['evTimeOnIce'], 
     item3['ppTimeOnIce'], 
     item3['shTimeOnIce'], 
     ) 
    writer.writerow(row) 

ノート

  • このソリューションは、数千万人とは対照的に、唯一の3の要求はあなたのコードに基づいて
  • を要求し、私は3つのデータセット内の行と仮定します同じオーダーであり、同じプレーヤーIDとゲームIDを参照していることを意味します。
  • 3つのデータセットの各行について、出力用に31列の行を作成し、ループごとに1回だけ書き出します。
  • ループは1つで、ネストされたループは1つではありません。
+0

これを見ていただきありがとうございます。各データ行の間の空白の行を除いてすべてが素晴らしいように見えます。私は上記の私の新しいOuputを編集し、空の行を削除する方法があるかどうか疑問に思っていましたか? –

+0

これで 'open()'ステートメントに 'newline = '''がある理由を理解しました。それを元に戻すと、あなたが設定されます。 –

+0

私はあまりにも、ハイ、ありがとう! –

関連する問題