Napisałem program Pythona, który robi wezwanie API do serwera WebServer raz na minutę, a następnie przeanalizuj odpowiedź JSON i zapisuje parsowane wartości do plików CSV.

Oto kod, który zapisuje wartości w pliku CSV:

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

Jak mogę to zrobić, aby oszczędza nagłówek tylko raz na najwyższym wierszu, a nie w każdym rzędzie?

AKTUALIZACJA:

Oto trochę więcej kodu do wywołania API i zapisu danych do pliku:

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

Nie mogę opublikować pełnego kodu, ponieważ będzie bardzo brzydki od długości około 700 linii, ale wyżej wymieniony kod powinien działać, aby utworzyć plik CSV

W ten sposób wygląda jeden z moich plików 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

Jest to tylko część pliku CSV, więcej wierszy utrzymuje się w miarę upływu czasu

Edytuj 2: Odpowiedź sugerowana przez Sparkofskę wydaje się pracować, ale w jakiś sposób kończy się dając pusty wiersz między każdą taką linią:

Czas, krótki, szybki, krótki objętość, longvolume, krótka pozycja, długa pozycja

05: 47,44,56,19528.824789.276522348630.

05: 48 44,56,19529.04 24789.276522348633.

Kod :

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...")
1
Sanders 15 marzec 2021, 13:22

2 odpowiedzi

Najlepsza odpowiedź

Możesz owinąć funkcję writerow, aby automatycznie dodać nagłówek w razie potrzeby.

Jeśli plik wyjściowy CSV nie jest pusty, możemy twierdzić, że nagłówek został już napisany i po prostu dołączyć wiersz. W przeciwnym razie (plik nie istnieje lub pusty) Piszemy nagłówek przed dołączeniem wiersza.

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, ...])
0
Sparkofska 15 marzec 2021, 13:51

Proszę sprawdzić, czy plik istnieje, jeśli już istnieje, użyj docisku do zapisu wierszy do pliku, napisz nagłówki. W ten sposób można uniknąć wielokrotnego pisania nagłówków. Proszę Zobacz ten link

0
Sparkofska 15 marzec 2021, 12:37