Python 将字符串列表更改为列表
因此,我将列表作为字符串保存到文件中。特别是,我做到了:Python 将字符串列表更改为列表,python,python-3.x,Python,Python 3.x,因此,我将列表作为字符串保存到文件中。特别是,我做到了: f = open('myfile.txt','w') f.write(str(mylist)) f.close() 但是,稍后当我再次打开此文件时,获取(字符串)列表,并希望将其更改回列表,所发生的事情如下所示: >>> list('[1,2,3]') ['[', '1', ',', '2', ',', '3', ']'] 我可以从文件中得到清单[1,2,3]吗 写入不带括号的文件:f.Write(str(mylis
f = open('myfile.txt','w')
f.write(str(mylist))
f.close()
但是,稍后当我再次打开此文件时,获取(字符串)列表,并希望将其更改回列表,所发生的事情如下所示:
>>> list('[1,2,3]')
['[', '1', ',', '2', ',', '3', ']']
我可以从文件中得到清单[1,2,3]吗
f.Write(str(mylist)[1:-1])
data=line.split(',')
data=map(int,data)
我将使用内置的json编码将python对象写入文件,或者,如果您不喜欢json,使用pickle和cpickle。两者都允许轻松地反序列化和序列化数据。我在打电话,但我回家后会上传示例代码 编辑: 好的,准备好一大堆Python代码,还有一些意见 JSON Python内置了对JSON或JavaScript对象表示法(一种轻量级数据交换格式)的支持。JSON支持Python的基本数据类型,例如字典(JSON调用对象:基本上只是键值对,并列出:由[and]封装的逗号分隔的值)。有关JSON的更多信息,请参阅。现在转到代码:
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,否则就使用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)可能会导致草率,非Python代码
最后一点就是我的两分钱
tl:dr;使用JSON将Python对象转储并加载到文件中Python开发人员传统上使用JSON序列化数据并将其写入文件 你可以这样做:
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]
尽可能使用ast.literal\u eval
而不是eval
:
:
安全地计算表达式节点或包含Python的字符串
表情。提供的字符串或节点只能由
以下Python文本结构:字符串、数字、元组、列表、,
口授、布尔语和无语
<>编辑:也可以考虑使用.
json.loads
以不同的字符串格式运行,但通常比ast.literal\u eval
快。(因此,如果您使用json.load
,请确保使用json.dump
保存数据)此外,它与语言无关。这里有两个最简单的主要选项。首先,使用:
与eval
不同,这更安全,因为它只计算python文本,如列表、字典、非类型、字符串等。如果我们在其中使用代码,这将引发错误
其次,使用json
模块,使用:
使用json
的一个巨大优势是它跨平台,并且您还可以轻松地写入文件
with open('data.txt', 'w') as f:
json.dump([1, 2, 3], f)
您将得到一百万个不同的答案,但按照优先顺序,您应该1)使用真正的序列化协议,如
json
、pickle
、或shelve
2)使用ast.literal\u eval
3)手动执行一些简陋的解析。明显没有出现:常规eval
@SteveJessop好奇,你的观点是什么?@SteveJessop我不得不同意。但即使是很多高代表性用户也经常这样做,特别是当他们不想与OP展开讨论或与其他答案展开竞争时。@zhangxaochen我指的是其他高代表性用户:DWell,Python开发人员,他们想要一个可怕的,不安全的解决方案。@Wooble您能解释一下吗?@jmu303:可以创建一个文件,在取消勾选时执行任意代码。如果用户的文件系统不安全,即如果攻击者可以将恶意文件放置在程序保存到的位置,更重要的是加载到的位置,则这是“不安全的”。@Wooble我的答案不是对Python事实上的数据持久化方法的公投。我的回答非常正确。但如果你愿意否决它,那就随它去吧。下面有一篇帖子解释了为什么eval是邪恶的:
>>> import ast
>>> ast.literal_eval('[1,2,3]')
[1, 2, 3]
>>> import json
>>> json.loads('[1,2,3]')
[1, 2, 3]
with open('data.txt', 'w') as f:
json.dump([1, 2, 3], f)