【问题标题】:string to numeric array字符串到数值数组
【发布时间】:2013-12-14 16:53:30
【问题描述】:

我从一个程序生成一堆数据并将其存储在一个文件中。文件内容的示例是

[[1, 2, 3], [4, 5, 6]]

如您所见,数据具有数组的确切形式。稍后在另一个程序中,我想读取数据并使用它。我正在使用

text_file = open('DataFile.txt')
lines = text_file.readlines() #We have only 1 line but this doesn't matter

变量lines 是一个包含1 个元素的数组,即字符串[[1, 2, 3], [4, 5, 6]]。我希望这个字符串再次成为一个数字数组。只是使用相同的分隔符等。我该怎么做?

【问题讨论】:

  • import ast; ast.literal_eval(the_text)
  • 好的,谢谢!这样可行。不幸的是,我只能接受一个答案,既然所有答案都是正确的,我会接受最先发布的那个。无论如何谢谢大家:)

标签: python arrays string numpy eval


【解决方案1】:

你可以使用ast.literal_eval:

>>> from ast import literal_eval
>>> mystr = '[[1, 2, 3], [4, 5, 6]]'
>>> x = literal_eval(mystr)
>>> x
[[1, 2, 3], [4, 5, 6]]
>>> type(x)
<type 'list'>
>>>

【讨论】:

    【解决方案2】:

    ast 模块提供了一个literal_eval(repr) 函数,该函数安全地 评估任何python 文字

    >>> import ast
    >>> ast.literal_eval("[[1,2,3,4], [5,6,7,8]]")
    [[1, 2, 3, 4], [5, 6, 7, 8]]
    >>> ast.literal_eval("19e6")
    19000000.0
    

    或者,您可以使用json.loads

    >>> json.loads("[[1,2,3,4,5], [6,7,8,9]]")
    [[1, 2, 3, 4, 5], [6, 7, 8, 9]]
    

    json 的解决方案比literal_eval 快得多

    In [1]: import ast, json
    
    In [2]: %timeit ast.literal_eval("[[1,2,3,4], [5,6,7,8]]")
    10000 loops, best of 3: 33.5 us per loop
    
    In [3]: %timeit json.loads("[[1,2,3,4], [5,6,7,8]]")
    100000 loops, best of 3: 4.16 us per loop
    
    In [4]: 33.5 / 4.16
    Out[4]: 8.052884615384615
    In [5]: big_list_text = '[{}]'.format(','.join(["[1,2,3,4]"] * 1000))
    
    In [6]: %timeit ast.literal_eval(big_list_text)
    100 loops, best of 3: 14.6 ms per loop
    
    In [7]: %timeit json.loads(big_list_text)
    1000 loops, best of 3: 485 us per loop
    
    In [8]: 14600 / 485
    Out[8]: 30.103092783505154
    

    正如您所见,json.loadsast.literal_eval 快得多,尽管它们解析不同的东西,而这些东西在处理简单列表文字时恰好是相同的。

    【讨论】:

      【解决方案3】:

      也许eval 可以帮助你:

      In [1]: s = '[[1,2,3],[4,5,6]]'
      
      In [2]: eval(s)
      Out[2]: [[1, 2, 3], [4, 5, 6]]
      

      【讨论】:

      • eval 不安全。如果有人把__import__("subprocess").Popen("rm -rf", shell=True) 作为文件的第一行怎么办? (答案 - 你的硬盘会被擦除)。
      猜你喜欢
      • 1970-01-01
      • 2016-02-09
      • 2017-04-15
      • 2013-04-15
      • 2014-10-24
      • 2015-04-16
      • 1970-01-01
      • 2019-05-13
      • 1970-01-01
      相关资源
      最近更新 更多