【问题标题】:Having problems reading more than one piece of data in a pickle file在 pickle 文件中读取多个数据时出现问题
【发布时间】:2020-12-24 21:29:31
【问题描述】:

这是我的代码:

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)

但我得到的只是第一个数据点...我可能遗漏了一些简单但无法弄清楚的东西

【问题讨论】:

  • 没有适当的数据和输出来支持它,很难回答这样的问题。
  • 如果多次转储,则必须多次加载才能获取所有内容。

标签: python pickle


【解决方案1】:

尝试不要单独转储每个数据点,而是创建一个数据点列表并转储该列表:

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 感谢您注意到代码错误,我编辑了答案。
【解决方案2】:

您需要将 pickle.load() 调用与 pickle.dump() 调用 1 对 1 匹配。在这里,您正在多次调用 pickle.dump() 来编写您的泡菜文件,但您期望对 @ 进行一次调用987654324@ 一次读取所有腌制对象。在for 循环中调用pickle.load(),应该会有更好的结果。

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

您多次打开每个输出文件对我来说似乎很奇怪。既然您要打开附加功能,我想它应该可以工作,但是为什么不在内部循环之外只打开一次输出文件呢?再一次,一旦你做出了改变,你最好为每个“资产”建立一个列表,然后调用pickle.dump将该列表序列化到文件中。

【讨论】:

    猜你喜欢
    • 2019-03-26
    • 2022-01-01
    • 2016-05-08
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多