在 pickle 文件中读取多个数据时遇到问题

Having problems reading more than one piece of data in a pickle file

这是我的代码:

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 文件,但是您期望一次调用 pickle.load() 即可一次读取所有已腌制的对象。将对 pickle.load() 的调用放在 for 循环中,您应该会得到更好的结果。

您可以做的另一件事是将所有 datapoint 对象放在一个列表中,然后通过一次调用 pickle.dump() 对该列表进行 pickle。那么您在加载序列化对象时尝试执行的操作应该会起作用。

您多次打开每个输出文件对我来说似乎很奇怪。由于您正在打开追加,我想它应该可以工作,但为什么不在内循环之外只打开一次输出文件呢?再一次,一旦你做了那个改变,你最好为每个“资产”建立一个列表,然后调用 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。