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

Pol*_*Dot 5 python file set output

我通常将 json 用于列表,但它不适用于集合。是否有类似的函数将集合写入输出文件 f?像这样的东西,但对于集合:

f=open('kos.txt','w')
json.dump(list, f)
f.close()
Run Code Online (Sandbox Code Playgroud)

piy*_*ani 9

如果我们在文件中写入空集,则使用ast.literal_eval(f.read())会出现错误。ValueError: malformed node or string我想,pickle用起来会更好。

如果 set 为空,则不会出现错误。

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)
Run Code Online (Sandbox Code Playgroud)


Jea*_*bre 7

json不是特定于 python 的格式。它知道列表和字典,但不知道集合或元组。

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

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

然后使用 ast.literal_eval

import ast
with open('kos.txt','r') as f:
   my_set = ast.literal_eval(f.read())
Run Code Online (Sandbox Code Playgroud)

这也适用于组列表,其中集嵌套列表内...只要数据可以被从字面上评价,没有集是空的(一个已知的限制literal_eval)。所以基本上序列化(几乎)任何python基本对象结构str都可以用它来解析。

对于空集情况,由于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)
Run Code Online (Sandbox Code Playgroud)

您也可以使用该pickle模块,但它会创建二进制数据,因此更加“不透明”,并且还有一种使用方法json如何 JSON 序列化集合?. 但为了你的需要,我会坚持str/ast.literal_eval