所以,我将一个列表保存为一个字符串文件。特别是,我做了:
f = open('myfile.txt','w')
f.write(str(mylist))
f.close()
但是,稍后当我再次打开此文件时,请使用(string-ified)列表,并希望将其更改回列表,会发生以下情况:
>>> list('[1,2,3]')
['[', '1', ',', '2', ',', '3', ']']
我可以这样做,以便从文件中获得列表[1,2,3]吗?
答案 0 :(得分:3)
In [285]: import ast
In [286]: ast.literal_eval('[1,2,3]')
Out[286]: [1, 2, 3]
尽可能使用ast.literal_eval
代替eval
:
ast.literal_eval:
安全地评估[s]表达式节点或包含Python的字符串 表达。提供的字符串或节点可能只包含 以下Python文字结构:字符串,数字,元组,列表, dicts,booleans和None。
编辑:另外,请考虑使用json。 json.loads
以不同的字符串格式运行,但通常比ast.literal_eval
更快。 (因此,如果您使用json.load
,请务必使用json.dump
保存您的数据。)此外,JSON format与语言无关。
答案 1 :(得分:3)
这里有两个最简单的主要选择。首先,使用ast.literal_eval
:
>>> import ast
>>> ast.literal_eval('[1,2,3]')
[1, 2, 3]
与eval
不同,这更安全,因为它只会评估python文字,例如列表,字典,NoneTypes,字符串等。如果我们在里面使用代码,这会引发错误。
其次,使用json.loads
:
json
模块
>>> import json
>>> json.loads('[1,2,3]')
[1, 2, 3]
使用json
的一大优势是它是跨平台的,您也可以轻松地写入文件。
with open('data.txt', 'w') as f:
json.dump([1, 2, 3], f)
答案 2 :(得分:1)
我会使用内置的json编码将python对象写入文件,或者如果你不喜欢json,则使用pickle和cpickle。两者都允许简单的反序列化和数据序列化。我在打电话,但当我回到家时,我会上传示例代码。
编辑: 好的,准备好了大量的Python代码和一些意见......
<强> JSON 强>
Python内置了对JSON或JavaScript Object Notation的支持,这是一种轻量级的数据交换格式。 JSON支持Python的基本数据类型,例如字典(JSON调用对象:基本上只是键值对,列出:由[和]封装的逗号分隔值。有关JSON的更多信息,请参阅this resource。现在代码:
import json #Don't forget to import
my_list = [1,2,"blue",["sub","list",5]]
with open('/path/to/file/', 'w') as f:
string_to_write = json.dumps(my_list) #Dump the string
f.write(string_to_write)
#The character string [1,2,"blue",["sub","list",5]] is written to the file
请注意,with
语句将在块完成执行时自动关闭文件。
要重新加载字符串,请使用
with open('/path/to/file/', 'r') as f:
string_from_file = f.read()
mylist = json.loads(string_from_file) #Load the string
#my_list is now the Python object [1,2,"blue",["sub","list",5]]
我喜欢JSON。使用JSON,除非你真的,真的有充分理由不这样做。
<强> cPickle的强>
将Python数据序列化到文件的另一种方法叫做pickling,在这种方法中,我们编写的文件超出了我们对文件的“需要”,因此我们有一些关于文件中的字符如何与Python对象相关的元信息。有一个内置的pickle
类,但我们会使用cpickle
,因为它是用C实现的,比pickle
快得多(大约100倍但是我没有引用该数字)。然后转储代码变为
import cpickle #Don't forget to import
with open('/path/to/file/', 'w') as f:
string_to_write = cpickle.dumps(my_list) #Dump the string
f.write(string_to_write)
#A very weird character string is written to the file, but it does contain the contents of our list
要加载,请使用
with open('/path/to/file/', 'r') as f:
string_from_file = f.read()
mylist = cpickle.loads(string_from_file) #Load the string
#my_list is now the Python object [1,2,"blue",["sub","list",5]]
<强>比较强>
请注意我们使用JSON编写的代码与使用cpickle编写的代码之间的相似之处。实际上,两种方法之间唯一的主要区别是文本(哪些字符)实际写入文件。我相信JSON比cpickle更快,更节省空间 - 但cpickle是一个有效的替代品。此外,JSON格式比cpickle奇怪的语法更通用。
关于评估的说明
请不要随意使用eval()
。看起来你对Python来说比较新,eval
可能是一个冒险的功能。它允许对任何Python代码进行未经检查的评估,因此如果您依赖于用户输入文本,则可能是a)风险,并且b)可能导致草率,非Pythonic代码。
最后一点只是我的两分钱。
<强> TL:博士;使用JSON将Python对象转储并加载到文件
答案 3 :(得分:1)
Python开发人员传统上使用pickle
来序列化他们的数据并将其写入文件。
你可以这样做:
import pickle
mylist = [1,2,3]
f = open('myfile', 'wb')
pickle.dump(mylist, f)
然后重新打开:
import pickle
f = open('myfile', 'rb')
mylist = pickle.load(f) # [1,2,3]
答案 4 :(得分:0)
不带括号的文件:f.write(str(mylist)[1:-1])
阅读该行后,将其拆分以获取列表:data = line.split(',')
要转换为整数:data = map(int, data)