我通常使用json来处理列表,但它不适用于集合。是否有类似的函数可以将集合写入输出文件f?就像这样,但针对集合:
我通常使用 JSON 处理列表,但是它无法处理集合。是否有类似的函数可以将集合写入输出文件 f 呢?就像下面这样,但是是针对集合的:
f=open('kos.txt','w')
json.dump(list, f)
f.close()
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
。我认为使用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
ast.literal_eval(f.read())
处产生ValueError: malformed node or string:
。 - piyush-balwanistr(set())
返回set()
,所以它不能用于空集合。但是可以通过一些技巧来实现,例如检查set()
并将其替换为空集合。 - Jean-François Fabre