在Python中将集合写入输出文件

11

我通常使用json来处理列表,但它不适用于集合。是否有类似的函数可以将集合写入输出文件f?就像这样,但针对集合:


我通常使用 JSON 处理列表,但是它无法处理集合。是否有类似的函数可以将集合写入输出文件 f 呢?就像下面这样,但是是针对集合的:
f=open('kos.txt','w')
json.dump(list, f)
f.close()
2个回答

14

json 不是一个专门用于 Python 的格式。它知道列表和字典,但不知道集合或元组。

但如果你想保存一个纯Python数据集,可以使用字符串转换。

with open('kos.txt','w') as f:
   f.write(str({1,3,(3,5)}))  # set of numbers & a tuple

然后使用 ast.literal_eval 再次读取它。

import ast
with open('kos.txt','r') as f:
   my_set = ast.literal_eval(f.read())

只要数据可以被文字直接解析并且没有空集合(这是literal_eval已知限制),它也适用于包含集合的列表、嵌套列表中嵌套了集合等任何情况。因此,使用str序列化(几乎)所有Python基本对象结构都可以通过它进行解析。

对于空集合的情况,需要应用一个巧妙的方法,因为无法解析set()

import ast
with open('kos.txt','r') as f:
   ser = f.read()
my_set = set() if ser == str(set()) else ast.literal_eval(ser)

您也可以使用 pickle 模块,但它创建的是二进制数据,因此更加“不透明”,还有一种方法可以使用 json:如何将集合序列化为 JSON?。但对于您的需求,我建议使用 str/ast.literal_eval


如果存在空集,则此解决方案将在ast.literal_eval(f.read())处产生ValueError: malformed node or string: - piyush-balwani
str(set()) 返回 set(),所以它不能用于空集合。但是可以通过一些技巧来实现,例如检查 set() 并将其替换为空集合。 - Jean-François Fabre

8
使用ast.literal_eval(f.read())将会在文件中写空集合时产生错误ValueError: malformed node or string。我认为使用pickle会更好。如果集合为空,这不会产生任何错误。
import pickle

s = set()

##To save in file
with open('kos.txt','wb') as f:
   pickle.dump(s, f)

##To read it again from file
with open('kos.txt','rb') as f:
   my_set = pickle.load(f)

我在我的解决方案中已经提到了 pickle。唯一有趣的特点是空集合情况,可以模拟(在这里讨论:https://bugs.python.org/issue24663)。否则,pickle 缺点是...所有其它的(无法编辑,二进制格式等)。 - Jean-François Fabre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接