gpt4 book ai didi

Python/SQLite 将列表存储为二进制文件 (blob)

转载 作者:行者123 更新时间:2023-11-28 16:48:29 27 4
gpt4 key购买 nike

sqlite 的官方文档建议将列表存储为二进制对象。谷歌让我得到了各种建议。一种是使用数组模块 (array.array('B', my_list2),但这不适用于非平凡列表:

my_list2 = [(23,"Bob"), (22,"Alice")]
array.array('B',my_list2)

TypeError: an integer is required

另一个建议涉及使用 pickle,但有人插话说它不安全。最后一个建议是为每个列表变量创建一个新表,其中有几个。不过,我对制作复杂的架构犹豫不决。

我该怎么办?我应该如何将 my_list2 与其他列表一起存储在数据库中?

编辑

找到了一个优雅整洁的解决方案,适用于简单和复杂的情况,代码最少:

import json
my_list2 = [(23,"Bob Baker"), (22,"Alice Adams")]
my_list2_str = json.dumps(my_list2)
print type(my_list2_str)
<type 'str'>
list2 = json.loads(my_list2_str)
print list2, type(list2)
[(23, u"Bob Baker"), (22, u"Alice Adams")] <type 'list'>

最佳答案

这个问题似乎与this earlier SO question 非常相似所以起初我认为这可能会解决你的问题。但是再看看你的问题,你似乎确实读过这个问题,因为你提到了他们提出的两种方法。此外,由于您的数据类型不同(元组列表而不是整数列表),我会给您一个通行证。

做一些研究我发现很多代码示例使用方法 sqlite3.Binary() (例如 here )。这可能是您想要的,但让我担心的是,我在 Sqlite3 Python Interface API 中找不到此功能的绝对没有文档 .因此,我建议不要使用它。我猜这种方法已被弃用,但我找不到任何关于替代方法的明确文档。

也就是说,如果您阅读 Sqlite3 Python Interface API ,你会看到它自动将 BLOB 转换为 python buffer对象(和 BLOB 的缓冲区对象)。所以在我看来,如果您可以将列表转换为缓冲区,那么您就可以轻松地将其存储为 BLOB。

在我的研究中,我发现列表不能存储为缓冲区。我还发现虽然有将列表转换为缓冲区的方法,但它们需要简单类型的列表(即不是元组)。因此,我认为最好的办法是定义一些实用方法,用于将列表与字符串相互转换,然后将字符串转换为缓冲区(并在您从数据库中检索它们时返回)。

def myListToStr(myList):
"""This method takes a list of (int, str) tuples and converts them to a string"""

strList = ""
for item in myList:
num, name = item #split the tuple

strList += "{}:{} ".format(num, name) #append the tuple in "num:name" format with a " " delimiter

return strList[:-1] #remove the final space (unneeded)

def strToMyList(myStr):
"""This method takes a string in the format "int:str int:str int:str..."
and converts it to a list of (int, str) tuples"""

myList = []
for tup in myStr.split(" "): #for each converted tuple
numStr, name = tup.split(":") #split the tuple

num = int(numStr) #NOTE: this will throw an error if numStr.isdigit() is False
myList.append(num, name)

return myList

现在,转换为缓冲区就像

my_list2Buff = buffer(myListToStr(my_list2))

然后返回...

my_list2 = strToList(str(my_list2Buff))

关于Python/SQLite 将列表存储为二进制文件 (blob),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11076107/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com