Возникли проблемы с чтением более одного фрагмента данных в файле рассола

Вот мой код:

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)

Но все, что я получаю, это первая точка данных... Я, вероятно, упускаю что-то простое, но не могу понять это.

Без надлежащих данных и выходных данных, подтверждающих это, трудно ответить на такие вопросы.

Aparna Chaganti 24.12.2020 22:40

Если вы выгружаете несколько раз, вы должны загрузить несколько раз, чтобы получить все содержимое.

MisterMiyagi 24.12.2020 22:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
127
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам нужно сопоставить вызовы 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 Когда я начал писать свой ответ, другого ответа не существовало. Я не "воровал" решение Стива и реализовывал его, я сам придумал это решение.

Roy Cohen 24.12.2020 22:47

Я понимаю, что вы пытаетесь здесь сделать, но код не будет работать так, как у вас есть. Ваша запись в pickle.dump завершится ошибкой, потому что file в этот момент не будет указывать на открытый файл. В настоящее время вы открываете каждый выходной файл несколько раз, но каждый раз ничего с ним не делаете. Переместите открытие выходного файла непосредственно перед вызовом pickle.dump, и я думаю, что этот код должен работать.

CryptoFool 24.12.2020 22:47

@Steve Спасибо, что заметили, что код неверен, я отредактировал свой ответ.

Roy Cohen 24.12.2020 22:51

Другие вопросы по теме