python中的csv头是否仅位于顶行?

2024-10-02 20:32:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一个python程序,每分钟对Web服务器进行一次api调用,然后解析json响应,并将解析后的值保存到csv文件中

以下是将值保存到csv文件中的代码:

with open('data.csv', 'a', newline='') as file:
    writer = csv.writer(file)
    writer.writerow([current_time,SHORTPERC, LONGPERC, SHORTvolume, longVolume, longPositions, shortPositions])

如何使标题只在最上面的行上保存一次,而不是在每行上保存一次

更新:

下面是一些进行api调用并将数据写入文件的代码:

from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
import requests
import json
import csv
from datetime import datetime






def fn():
    print("Starting...")
    session_id = "auZsJ4F2RsQNJxSPTMDt2238324"
    Outlook='http://www.myfxbook.com/api/get-community-outlook.json?session=' + session_id
    Outlook_response = requests.get(Outlook)
    Outlook_data = Outlook_response.json()['symbols']
    now = datetime.now()
    current_time = now.strftime("%H:%M")





    EURUSD=Outlook_data[0]
    SHORTPERC=EURUSD['shortPercentage']
    LONGPERC =EURUSD['longPercentage']
    SHORTvolume=EURUSD['shortVolume']
    longVolume=EURUSD['longVolume']
    longPositions=EURUSD['longPositions']
    shortPositions=EURUSD['shortPositions']
    with open('data.csv', 'a', newline='') as file:
        writer = csv.writer(file)
        writer.writerow([current_time,SHORTPERC, LONGPERC, SHORTvolume, longVolume, longPositions, shortPositions])
    with open('data1.csv', 'a', newline='') as file:
        writer = csv.writer(file)
        writer.writerow([SHORTvolume, longVolume])
    with open('data2.csv', 'a', newline='') as file:
        writer = csv.writer(file)
        writer.writerow([SHORTPERC, LONGPERC])

我不能张贴完整的代码,因为它将是非常丑陋的,因为它约700行长,但上述代码应该工作,以创建csv文件

这是我的一个csv文件的外观:

07:11,31,69,555.55,1265.14,4750,2607
07:12,31,69,555.55,1265.16,4751,2607
07:13,31,69,555.55,1265.16,4751,2607
07:14,30,70,555.56,1267.36,4752,2608
07:15,30,70,555.56,1267.36,4752,2608
07:16,30,70,555.56,1267.36,4752,2608
07:17,30,70,555.46,1267.36,4752,2607
07:18,31,69,558.61,1267.36,4752,2610
07:19,31,69,558.61,1267.37,4753,2610
07:20,31,69,561.58,1267.37,4753,2611
07:21,31,69,561.61,1267.37,4753,2613
07:22,31,69,561.65,1267.37,4753,2614
07:23,31,69,561.65,1267.36,4752,2614

这只是csv文件的一部分,随着时间的推移,会不断添加更多的行

编辑2: Sparkoffska提出的答案似乎有效,但不知何故,它最终在每一行之间都给出了一个空行,如下所示:

Time,ShortPer,LongPer,ShortVolume,LongVolume,ShortPosition,LongPosition

05:47,44,56,19528.8,24789.27,65223,48630

05:48,44,56,19529.04,24789.27,65223,48633

代码:

EURUSD=Outlook_data[0]
SHORTPERC=EURUSD['shortPercentage']
LONGPERC =EURUSD['longPercentage']
SHORTvolume=EURUSD['shortVolume']
longVolume=EURUSD['longVolume']
longPositions=EURUSD['longPositions']
shortPositions=EURUSD['shortPositions']
filename='EURUSD.csv';

def write_row_header_aware(filename, row):

     
    if not os.path.exists(filename) or os.stat(filename).st_size == 0:
         
        with open(filename, 'a') as file:
            writer = csv.writer(file)
            writer.writerow(['Time', 'ShortPer', 'LongPer','ShortVolume','LongVolume','ShortPosition','LongPosition'])

     
    with open(filename, 'a') as file:
        writer = csv.writer(file)
        writer.writerow([current_time,SHORTPERC, LONGPERC, SHORTvolume, longVolume, longPositions, shortPositions])
    
write_row_header_aware(filename, [current_time,SHORTPERC, LONGPERC, SHORTvolume, longVolume, longPositions, shortPositions])
print("done...")

Tags: 文件csvwithopenfilenamefilewriteroutlook
2条回答

您可以包装writerow函数,使其在需要时自动添加标头

如果您的输出csv文件不是空的,我们可以断言头已经写入,只需附加行即可。否则(文件不存在或为空),我们在追加行之前写入头

import os

def write_row_header_aware(filename, row):

    # in case file doesn't exist or is empty
    if not os.path.exists(filename) or os.stat(filename).st_size == 0:
        # write header
        with open(filename, 'a', newline='') as file:
            writer = csv.writer(file)
            writer.writerow(['current_time', 'SHORTPERC', 'LONGPERC', ...])

    # write line as usual
    with open(filename, 'a', newline='') as file:
        writer = csv.writer(file)
        writer.writerow(row)
    
write_row_header_aware('data.csv', [current_time, SHORTPERC, LONGPERC, ...])

请检查文件是否存在,如果已经存在,请使用“附加”将行写入文件,否则请写入标题。这样可以避免多次写入标题。请refer to this link

相关问题 更多 >