使用Python向一个Csv写入多个请求

时间:2017-12-20 04:17:05

标签: python export-to-csv

我遇到了将两个脚本组合在一起的问题。我曾尝试将writer.writerow放在几个不同的地方,但我已经没有想法了。从输出中可以看出,它循环通过最后一个循环并重复前两个循环,直到第三个循环完成而不是移动到第二个循环。谢谢你看看!

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 个答案:

答案 0 :(得分:1)

由于复杂性,这个问题并不难,但由于数据量很大(接近10,000行数据),而且每行有大约30多列。在阅读完代码后,我相信我理解您对输出的要求:3组数据的组合。这是我的尝试:

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个循环,而不是3个嵌套循环。