繁体   English   中英

将字符串列表更改为列表

[英]Change string list to list

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

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

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

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

我可以这样做,以便从文件中获得列表[1,2,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,布尔值和None。

编辑:另外,考虑使用json json.loads以不同的字符串格式运行,但通常比ast.literal_eval更快。 (所以如果你使用json.load ,务必使用保存您的数据json.dump 。)此外, JSON格式与语言无关。

这里有两个最简单的主要选择。 首先,使用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)

我会使用内置的json编码将python对象写入文件,或者,如果你不喜欢json,可以使用pickle和cpickle。 两者都允许简单的反序列化和数据序列化。 我在打电话,但当我回到家时,我会上传示例代码。

编辑:好的,准备好了大量的Python代码,以及一些意见......

JSON

Python内置了对JSON或JavaScript Object Notation的支持,这是一种轻量级的数据交换格式。 JSON支持Python的基本数据类型,例如字典(JSON调用对象 :基本上只是键值对, 列表 :由[和]封装的逗号分隔值。有关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,除非你真的,真的有充分理由不这样做。

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对象转储并加载到文件

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]
  1. 写入不带括号的文件: f.write(str(mylist)[1:-1])

  2. 读完该行后,将其拆分以获得一个列表: data = line.split(',')

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM