不写入文件的两个函数之一

2024-05-29 07:18:24 发布

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

我一直在编写这个脚本,最近我一直试图通过将所有内容都放在自己的函数中来让它更干净。下面的代码运行时没有错误,获取我想要的数据并将其保存到mongdb,但它不会写入csv

函数save_dbsave_csv非常相似,我不明白为什么save_db工作而save_csv不工作。另外,我想在这两个函数中都使用ldf变量。我是否必须在这两个函数中都设置ldf = make_df(data),或者是否有办法将ldf共享到save_csv,因为它已经在save_db中被调用了。功能使我沮丧

import requests
import json
import pandas as pd
from pymongo import MongoClient
import os, time

market_symbols = []
candleInterval = '1'

def get_candle(marketSymbol):      
    candle_url = f'https://api.kraken.com/0/public/OHLC?pair={marketSymbol}&interval={candleInterval}'
    candle_data = requests.get(candle_url)
    bytes_value = candle_data.content
    my_json = bytes_value.decode('utf8').replace("'", '"')
    data = (json.loads(my_json))
    data['symbol'] = marketSymbol    
    return data

def make_df(data):
    df = pd.DataFrame(data['result'])        
    unnested_df = pd.concat([
        pd.DataFrame(df[x].tolist()).add_prefix(f'{x}_') 
        for x in df
    ], axis=1)   
    
    fdf = unnested_df
    fdf.columns =['Timestamp', 'Open', 'High', 'Low', 'Close', 'Vwap', 'Volume', 'Count', 'Last']   
    fdf.drop('Last',axis=1,inplace=True) 
    fdf.insert(1, 'Time', pd.to_datetime(fdf.Timestamp, unit='s'))  
    fdf.insert(9, 'Pair', data['symbol'])
    ldf=fdf.iloc[[-2]]
    print(ldf)  
    return ldf

def save_db(data): 
    ldf = make_df(data)
    db_name = 'KTDB'
    db_collect = 'intermittent'
    client = MongoClient('localhost', 27017)
    kdb = client[db_name]          
    pdata = ldf.to_dict(orient='records')  
    kdb[db_collect].insert_many(pdata)    

def save_csv(data):        
    ldf = make_df(data)
    csv_file = f"ktester-{candleInterval}.csv"    

    if(csv_file in os.listdir()): #append, file exists 
        csv_string = ldf.to_csv(index=False, encoding='utf-8', header=False)
        with open(csv_file, 'a') as f:
            f.write(csv_string)
    else: #write new file
        csv_string = ldf.to_csv(index=False, encoding='utf-8')
        with open(csv_file, 'w') as f:
            f.write(csv_string)  

if __name__ == "__main__":
    
    candle_symbols = ['XBTUSD', 'ADAUSD']
    
    
    for symbol in candle_symbols:
        tick_data = get_candle(symbol) 
        save_db(tick_data)                            
        save_csv(tick_data)           
        
    

Tags: csv函数importjsondfdbdatamake

热门问题