首页 > 解决方案 > 写入 CSV 时跳过行

问题描述

我编写了一个从 2 个单独的 API 收集数据的脚本,但我无法将其全部显示在一行上,而是显示如下:

Device  Status  Model   StatusSub  

d8d     Online      
122  Disconnected   

当我希望它看起来像这样时;

Device  Status  Model   StatusSub

d8d    Online    1202   Disconnected        

这是我的代码,API 受密码保护,因此您将无法直接运行它:

while True:#always run
if datetime.datetime.now().minute % 15 == 0 or True:#once every 15 minutes
    name = [('Device'), ('Status'), ('Model'), ('StatusSub')]
    space = [(''),('')]
    print (datetime.datetime.now())
    today = datetime.date.today().strftime('E.Subdevice.Logs.%m-%d-%Y')#file name
    if os.path.exists(today + '.csv'):#Create new file if its a new day
        Append_write = 'ab'
    else:
        Append_write = 'wb'

    with open(today + '.csv',Append_write) as myFile:#open todays csv file, set to write. 
        writer = csv.writer(myFile)
        writer.writerow(name)
        writer.writerow(space)
        #Loop to collect device name and status 500 at a time and print all 2080 in the file specified above.     
        for x in range(5):
            string1 = "https://api.raincloud.com/rest/device?networkName=Company&take=500&skip="+str(x*500)
            response = requests.get(string1,headers=headers).json()
            for y in range (len(response)):
                myData = [(response[y]['device']),(response[y]['status'])]
                string2= 'https://api.raincloud.com/rest/device/'+str(myData[0])+'/subdevice'
                response2 = requests.get(string2,headers=headers).json()
                for z in range (len(response2)):
                     myData2 = [(response2[z]['model']),(response2[z]['status']),datetime.datetime.now()]


                writer.writerow(myData)
                writer.writerow(myData2) 

任何帮助表示赞赏。

标签: pythoncsv

解决方案


我认为修复很简单,只需更改即可

writer.writerow(myData)
writer.writerow(myData2)

writer.writerow(myData + myData2)

每次调用该writerow函数时,它都会写入一个新行。但是,如果您想将所有信息写入一行,则需要在一次writerow调用中执行它。因此,将您的两个列表合并为一个列表并调用writerow该列表

这段代码虽然有点令人担忧

for z in range (len(response2)):
  myData2 = [(response2[z]['model']),(response2[z]['status']),datetime.datetime.now()]

这是循环遍历作为第二个响应的 json 主体的数组,但myData2每次都会覆盖。因此myData2,只会等于您响应的最后一个模型和状态。

您的 CSV 中也没有时间戳列,但您正在添加时间myData2并将其写入 CSV。


推荐阅读