Улучшить скорость записи файла CSV - PullRequest
0 голосов
/ 07 июня 2018

Код ниже работает просто отлично.Мне интересно, есть ли способ улучшить скорость записи этого.Поскольку в настоящее время для записи файла .csv требуется от 12 до 20 секунд.

import csv
import os

data = [...1000 item list, where each item is a dictionary with 8 values...]

for candle in data:
        if os.path.isfile('data'+os.sep+i+os.sep+coin_symbol+'.csv'):
            H = []
            H.append(candle['timestamp'])
            H.append(candle['open'])
            H.append(candle['close'])
            H.append(candle['min'])
            H.append(candle['max'])
            H.append(candle['volume'])
            H.append(candle['volumeQuote'])

            with open('data'+os.sep+i+os.sep+coin_symbol+'.csv', 'a', newline="") as csvfile:
                csvwriter = csv.writer(csvfile, delimiter=',')
                csvwriter.writerow(H)
        else: 

                H = []
                H.append('TimeStamp')
                H.append('Open')
                H.append('Close')
                H.append('Min')
                H.append('Max')
                H.append('Volume')
                H.append('VolumeQuote')



                with open('data'+os.sep+i+os.sep+coin_symbol+'.csv', 'w', newline="") as csvfile:
                    csvwriter = csv.writer(csvfile, delimiter=',')
                    csvwriter.writerow(H)
                H = []
                H.append(candle['timestamp'])
                H.append(candle['open'])
                H.append(candle['close'])
                H.append(candle['min'])
                H.append(candle['max'])
                H.append(candle['volume'])
                H.append(candle['volumeQuote'])

                with open('data'+os.sep+i+os.sep+coin_symbol+'.csv', 'a', newline="") as csvfile:
                    csvwriter = csv.writer(csvfile, delimiter=',')
                    csvwriter.writerow(H)

Для утверждения Else, есть ли способ написать это по-другому?

1 Ответ

0 голосов
/ 07 июня 2018

Следующий подход позволяет избежать повторного открытия выходного файла.Он также использует DictWriter, поскольку data уже является словарем:

import os
import csv


filename = os.path.join('data', i, coin_symbol + '.csv')
mode = 'a' if os.path.isfile(filename) else 'w'

fieldnames = ['timestamp', 'open', 'close', 'min', 'max', 'volume', 'volumeQuote']
header = ['TimeStamp', 'Open', 'Close', 'Min', 'Max', 'Volume', 'VolumeQuote']

with open(filename, mode, newline='') as f_output:
    csv_output = csv.DictWriter(f_output, fieldnames=fieldnames)

    if mode == 'w':
        csv_output.writerow(dict(zip(fieldnames, header)))

    for row in data:
        csv_output.writerow(row)

os.path.join() - лучший подход, чем попытка добавить os.sep.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...