Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将复杂列表转换为字符串并返回到Python 3.7中?_Python_Python 3.x_Python 3.7 - Fatal编程技术网

如何将复杂列表转换为字符串并返回到Python 3.7中?

如何将复杂列表转换为字符串并返回到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),

我正试图将Python列表保存到一个文件中,并在重新启动程序时重新读取它们。问题是我的列表很复杂:即元组中的元组数量不同


我能想到的最好办法是,最初将列表转换为一个字符串,它可以工作,但我想不出恢复更改的方法

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)))]