Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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 将字符串列表更改为列表_Python_Python 3.x - Fatal编程技术网

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)