Вот мой код:
import sqlite3
import pickle
connection = sqlite3.connect("D:\\Programming\\TradingInvestment\\Datasets\\Binance_Trades_Data.db")
cur = connection.cursor()
asset_list = ["BTC", "ETH", "AAVE", "YFI", "COMP"]
for asset in asset_list:
table = cur.execute("SELECT * FROM " + asset + "USDT_TXS ORDER BY time")
for i in table:
data = cur.fetchone()
if int(str(data[4])[:-3]) > 1608812669:
with open(asset + ".pickle", "ab") as file:
datapoint = (int(str(data[4])[:-3]), data[1])
pickle.dump(datapoint, file)
Затем я пытаюсь использовать это, чтобы прочитать все точки данных в одном из файлов:
import pickle
file_read = pickle.load(open("BTC.pickle", "rb"))
for i in file_read:
print(i)
Но все, что я получаю, это первая точка данных... Я, вероятно, упускаю что-то простое, но не могу понять это.
Если вы выгружаете несколько раз, вы должны загрузить несколько раз, чтобы получить все содержимое.
Вам нужно сопоставить вызовы pickle.load()
с вызовами pickle.dump()
1 к 1. Здесь вы делаете несколько вызовов pickle.dump()
для записи файла рассола, но вы ожидаете, что один вызов pickle.load()
прочитает все ваши объекты рассола одновременно. . Поместите свой вызов pickle.load()
внутри цикла for
, и вы должны получить лучшие результаты.
Еще одна вещь, которую вы можете сделать, это поместить все ваши datapoint
объекты в список, а затем замариновать этот список одним вызовом pickle.dump()
. Тогда то, что вы пытаетесь сделать при загрузке сериализованных объектов, должно работать.
Мне кажется странным, что вы открываете каждый выходной файл несколько раз. Поскольку вы открываете для добавления, я думаю, это должно работать, но почему бы не открыть выходной файл только один раз вне внутреннего цикла? И снова, как только вы внесли это изменение, вам лучше создать отдельный список для каждого «актива», а затем сделать один вызов pickle.dump
для сериализации этого списка в файл.
Попробуйте вместо того, чтобы сбрасывать каждую точку данных отдельно, создайте список точек данных и выгрузите список:
import sqlite3
import pickle
connection = sqlite3.connect("D:\\Programming\\TradingInvestment\\Datasets\\Binance_Trades_Data.db")
cur = connection.cursor()
asset_list = ["BTC", "ETH", "AAVE", "YFI", "COMP"]
for asset in asset_list:
table = cur.execute("SELECT * FROM " + asset + "USDT_TXS ORDER BY time")
datapoints = []
for i in table:
data = cur.fetchone()
if int(str(data[4])[:-3]) > 1608812669:
datapoint = (int(str(data[4])[:-3]), data[1])
datapoints.append(datapoint)
with open(asset + ".pickle", "ab") as file:
pickle.dump(datapoints, file)
И затем, при чтении, вы можете использовать тот же код, который вы используете сейчас, но он неправильно обрабатывает файл (он никогда не закрывается), вместо этого используйте это:
import pickle
with open("BTC.pickle", "rb") as f:
file_read = pickle.load(f)
for i in file_read:
print(i)
Обновлено: переместил оператор with. -Спасибо, @Steve.
@zixuan Когда я начал писать свой ответ, другого ответа не существовало. Я не "воровал" решение Стива и реализовывал его, я сам придумал это решение.
Я понимаю, что вы пытаетесь здесь сделать, но код не будет работать так, как у вас есть. Ваша запись в pickle.dump
завершится ошибкой, потому что file
в этот момент не будет указывать на открытый файл. В настоящее время вы открываете каждый выходной файл несколько раз, но каждый раз ничего с ним не делаете. Переместите открытие выходного файла непосредственно перед вызовом pickle.dump
, и я думаю, что этот код должен работать.
@Steve Спасибо, что заметили, что код неверен, я отредактировал свой ответ.
Без надлежащих данных и выходных данных, подтверждающих это, трудно ответить на такие вопросы.