将字符串列表更改为列表

时间:2014-01-24 02:14:19

标签: python python-3.x

所以,我将一个列表保存为一个字符串文件。特别是,我做了:

f = open('myfile.txt','w')
f.write(str(mylist))
f.close()

但是,稍后当我再次打开此文件时,请使用(string-ified)列表,并希望将其更改回列表,会发生以下情况:

>>> list('[1,2,3]')
['[', '1', ',', '2', ',', '3', ']']

我可以这样做,以便从文件中获得列表[1,2,3]吗?

5 个答案:

答案 0 :(得分:3)

In [285]: import ast

In [286]: ast.literal_eval('[1,2,3]')
Out[286]: [1, 2, 3]

尽可能使用ast.literal_eval代替evalast.literal_eval

  

安全地评估[s]表达式节点或包含Python的字符串   表达。提供的字符串或节点可能只包含   以下Python文字结构:字符串,数字,元组,列表,   dicts,booleans和None。

编辑:另外,请考虑使用jsonjson.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)

  1. 不带括号的文件:f.write(str(mylist)[1:-1])

  2. 阅读该行后,将其拆分以获取列表:data = line.split(',')

  3. 要转换为整数:data = map(int, data)