python中的csv头是否仅位于顶行?
我编写了一个python程序,每分钟对Web服务器进行一次api调用,然后解析json响应,并将解析后的值保存到csv文件中 以下是将值保存到csv文件中的代码:python中的csv头是否仅位于顶行?,python,csv,Python,Csv,我编写了一个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, longPositi
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提出的答案似乎有效,但不知何故,它最终在每一行之间都给出了一个空行,如下所示:
时间,空头,长头,短量,长量,短仓,长仓
05:47,44,5619528.824789.276522348630
05:48,44,5619529.0424789.276522348633
代码:
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...")
请检查文件是否存在,如果已经存在,请使用“附加”将行写入文件,否则请写入标题。这样可以避免多次写入标题。请您可以包装
writerow
函数,使其在需要时自动添加标题
如果您的输出csv文件不是空的,我们可以断言头已经写入,只需附加行即可。否则(文件不存在或为空),我们在追加行之前写入头
导入操作系统
def write_row_header_aware(文件名,行):
#以防文件不存在或为空
如果不是os.path.exists(文件名)或os.stat(文件名).st_size==0:
#写头
打开(文件名为“a”,换行符为“”)作为文件:
writer=csv.writer(文件)
writer.writerow(['current_time','SHORTPERC','LONGPERC',…]))
#照常写一行
打开(文件名为“a”,换行符为“”)作为文件:
writer=csv.writer(文件)
writer.writerow(行)
写入行标题识别('data.csv',[current\u time,SHORTPERC,LONGPERC,…])
我尝试了这个片段,它只在文件中写了一行,没有标题。您可以添加一个更广泛的示例吗?您的代码没有给出您所说的输出。可能会发布更多的代码和您得到的输出的小样本。我已经更新了代码并添加了更多的代码检查类这是否回答了您的问题?感谢@Sparkofska解决方案似乎正在工作,但它在行之间生成了空白,我已编辑了显示问题的OP,您能检查我是否做错了什么吗?这可能是由于windows上的行终止符。尝试将newline=''
参数添加到open()
函数中,就像您在第一个代码段中所做的那样。请参阅我编辑的答案。是的,添加换行符=''非常有效