如何将复杂列表转换为字符串并返回到Python 3.7中?
我正试图将Python列表保存到一个文件中,并在重新启动程序时重新读取它们。问题是我的列表很复杂:即元组中的元组数量不同如何将复杂列表转换为字符串并返回到Python 3.7中?,python,python-3.x,python-3.7,Python,Python 3.x,Python 3.7,我正试图将Python列表保存到一个文件中,并在重新启动程序时重新读取它们。问题是我的列表很复杂:即元组中的元组数量不同 我能想到的最好办法是,最初将列表转换为一个字符串,它可以工作,但我想不出恢复更改的方法 with open(filename, 'w') as f: f.write(str(objs)) f.close() 这是可行的,但如何将其返回到列表中 为了澄清我对复杂列表的定义,以下是一个示例: [(((0.0, 0.0, 0.0),
我能想到的最好办法是,最初将列表转换为一个字符串,它可以工作,但我想不出恢复更改的方法
with open(filename, 'w') as f:
f.write(str(objs))
f.close()
这是可行的,但如何将其返回到列表中
为了澄清我对复杂列表的定义,以下是一个示例:
[(((0.0, 0.0, 0.0), (1000.0, 0.0, 0.0), (0.0, 2.0, 0.0), (1000.0, 2.0,
0.0), (0.0, 0.0, 1000.0), (1000.0, 0.0, 1000.0), (0.0, 2.0, 1000.0),
(1000.0, 2.0, 1000.0)), ((0, 2, 3, 1), (4, 6, 7, 5), (1, 3, 7, 5), (4, 6,
2, 0), (2, 6, 7, 3), (4, 0, 1, 5)), ((255, 0, 0), (255, 128, 0), (255, 255,
0), (255, 255, 255), (0, 0, 255), (0, 255, 0)))]
正如@snakecharmerb已经提到的,您可以使用json或pickle。以下是一个例子:
[(((0.0, 0.0, 0.0), (1000.0, 0.0, 0.0), (0.0, 2.0, 0.0), (1000.0, 2.0,
0.0), (0.0, 0.0, 1000.0), (1000.0, 0.0, 1000.0), (0.0, 2.0, 1000.0),
(1000.0, 2.0, 1000.0)), ((0, 2, 3, 1), (4, 6, 7, 5), (1, 3, 7, 5), (4, 6,
2, 0), (2, 6, 7, 3), (4, 0, 1, 5)), ((255, 0, 0), (255, 128, 0), (255, 255,
0), (255, 255, 255), (0, 0, 255), (0, 255, 0)))]
代码:
输出:
Using json:
[[[[0.0, 0.0, 0.0], [1000.0, 0.0, 0.0], [0.0, 2.0, 0.0], [1000.0, 2.0, 0.0], [0.0, 0.0, 1000.0], [1000.0, 0.0, 1000.0], [0.0, 2.0, 1000.0], [1000.0, 2.0, 1000.0]], [[0, 2, 3, 1], [4, 6, 7, 5], [1, 3, 7, 5], [4, 6, 2, 0], [2, 6, 7, 3], [4, 0, 1, 5]], [[255, 0, 0], [255, 128, 0], [255, 255, 0], [255, 255, 255], [0, 0, 255], [0, 255, 0]]]]
Using pickle:
[(((0.0, 0.0, 0.0), (1000.0, 0.0, 0.0), (0.0, 2.0, 0.0), (1000.0, 2.0, 0.0), (0.0, 0.0, 1000.0), (1000.0, 0.0, 1000.0), (0.0, 2.0, 1000.0), (1000.0, 2.0, 1000.0)), ((0, 2, 3, 1), (4, 6, 7, 5), (1, 3, 7, 5), (4, 6, 2, 0), (2, 6, 7, 3), (4, 0, 1, 5)), ((255, 0, 0), (255, 128, 0), (255, 255, 0), (255, 255, 255), (0, 0, 255), (0, 255, 0)))]
正如您所见,json将元组转换为列表。str函数将把复杂的列表/嵌套列表和元组转换为字符串
此外,eval将任何字符串转换为实际的代码段
然而,正如Taras Savchyn所提到的,eval可以导致SQL注入和更多。因此,请改用ast.literal\u eval
因此:
>>>导入ast
>>>mylist=[0.0,0.0,0.0,1000.0,0.0,0.0,0.0,2.0,0.0,1000.0,0.0,0.0,0.0,1000.0,0.0,0.0,2.0,1000.0,1000.0,1000.0,2.0,1000.0,0,2,3,1,4,6,7,6,6,4,4,0,0,1,5,255,255,0,255,0,255,0,0,0,255,0,0,0,0]
>>>迈利斯特
[0.0, 0.0, 0.0, 1000.0, 0.0, 0.0, 0.0, 2.0, 0.0, 1000.0, 2.0, 0.0, 0.0, 0.0, 1000.0, 1000.0, 0.0, 1000.0, 0.0, 2.0, 1000.0, 1000.0, 2.0, 1000.0, 0, 2, 3, 1, 4, 6, 7, 5, 1, 3, 7, 5, 4, 6, 2, 0, 2, 6, 7, 3, 4, 0, 1, 5, 255, 0, 0, 255, 128, 0, 255, 255, 0, 255, 255, 255, 0, 0, 255, 0, 255, 0]
>>>mystring=strmylist
>>>打印字符串
'[0.0, 0.0, 0.0, 1000.0, 0.0, 0.0, 0.0, 2.0, 0.0, 1000.0, 2.0, 0.0, 0.0, 0.0, 1000.0, 1000.0, 0.0, 1000.0, 0.0, 2.0, 1000.0, 1000.0, 2.0, 1000.0, 0, 2, 3, 1, 4, 6, 7, 5, 1, 3, 7, 5, 4, 6, 2, 0, 2, 6, 7, 3, 4, 0, 1, 5, 255, 0, 0, 255, 128, 0, 255, 255, 0, 255, 255, 255, 0, 0, 255, 0, 255, 0]'
>>>类型字符串
>>>printast.literal\u evalmysting
[0.0, 0.0, 0.0, 1000.0, 0.0, 0.0, 0.0, 2.0, 0.0, 1000.0, 2.0, 0.0, 0.0, 0.0, 1000.0, 1000.0, 0.0, 1000.0, 0.0, 2.0, 1000.0, 1000.0, 2.0, 1000.0, 0, 2, 3, 1, 4, 6, 7, 5, 1, 3, 7, 5, 4, 6, 2, 0, 2, 6, 7, 3, 4, 0, 1, 5, 255, 0, 0, 255, 128, 0, 255, 255, 0, 255, 255, 255, 0, 0, 255, 0, 255, 0]
>>>typeast.literal\u evalmysting
希望这能解决你的问题。您可以对答案进行注释以询问任何进一步的查询您可以将列表保存在一个文件中,或者将其保存为将元组转换为列表。我能想到的最好办法是将列表转换为字符串。最初不要这样做。使用受支持的序列化格式,例如对任意对象使用pickle,甚至对于简单的列表只使用json,使用eval是一种不好的做法。是的,这正合适。因此,您可以将其保存在pickle文件中,而不是最初将列表转换为字符串并写入文件。fileName=my_list fileObject=openfileName,'wb'pickle.dumpmy_list,fileObject fileObject.close您可以使用cpickle而不是pickle,cpickle经过优化,比pickle快得多,尤其是在数据量较大的情况下。上面的代码可以像import cpickle as pickle一样进行更改
import pickle
with open('my_list.pkl', 'wb') as f:
pickle.dump(my_list, f)
with open('my_list.pkl', 'rb') as f:
loaded_list = pickle.load(f)
print('Using pickle:')
print(loaded_list)
Using json:
[[[[0.0, 0.0, 0.0], [1000.0, 0.0, 0.0], [0.0, 2.0, 0.0], [1000.0, 2.0, 0.0], [0.0, 0.0, 1000.0], [1000.0, 0.0, 1000.0], [0.0, 2.0, 1000.0], [1000.0, 2.0, 1000.0]], [[0, 2, 3, 1], [4, 6, 7, 5], [1, 3, 7, 5], [4, 6, 2, 0], [2, 6, 7, 3], [4, 0, 1, 5]], [[255, 0, 0], [255, 128, 0], [255, 255, 0], [255, 255, 255], [0, 0, 255], [0, 255, 0]]]]
Using pickle:
[(((0.0, 0.0, 0.0), (1000.0, 0.0, 0.0), (0.0, 2.0, 0.0), (1000.0, 2.0, 0.0), (0.0, 0.0, 1000.0), (1000.0, 0.0, 1000.0), (0.0, 2.0, 1000.0), (1000.0, 2.0, 1000.0)), ((0, 2, 3, 1), (4, 6, 7, 5), (1, 3, 7, 5), (4, 6, 2, 0), (2, 6, 7, 3), (4, 0, 1, 5)), ((255, 0, 0), (255, 128, 0), (255, 255, 0), (255, 255, 255), (0, 0, 255), (0, 255, 0)))]