簡體   English   中英

python 中的 csv header 僅在頂行?

[英]csv header in python only on the top row?

i have written a python program which makes an api call to a webserver once every minute and then parse the json response and saves parsed values in to the csv files.

這是將值保存到 csv 文件中的代碼:

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

我怎樣才能讓它只在最上面一行而不是每一行保存一次 header?

更新:

這里有更多代碼可以讓 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: Sparkofska 建議的答案似乎有效,但不知何故,它最終在每一行之間給出了一個空行,如下所示:

時間,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...")

請檢查文件是否存在,如果已經存在,請使用 append 將行寫入文件,否則寫入標題。 通過這種方式,您可以避免多次寫入標題。 參考此鏈接

如果需要,您可以包裝寫入器writerow讓它自動添加 header。

如果您的 output csv 文件不為空,我們可以斷言 header 已寫入,只需 Z9516Z4ADB15F51C7DBE19 行。 否則(文件不存在或為空)我們在追加行之前寫入 header。

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, ...])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM