在 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。
这是我的代码:
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。