【问题标题】:How to convert list lookalike into a list?如何将相似列表转换为列表?
【发布时间】:2013-12-30 20:50:30
【问题描述】:

我正在以这种格式从文件中读取数据行:

['A', 'B', 'C', 'D', 'E']
['1', '2', '3', '4', '5']

...等

但是,当我执行type(dataInput[0]) 时,它告诉我它来自字符串类型。虽然它看起来像一个带有括号和所有内容的列表。我怎样才能让dataInput[0] 直接变成一个列表而不是字符串?

这里有一些代码:

fobj = open(selectedCase, 'r').read()
dataInput = re.split('\n', fobj)

我见过这样的话题: How to convert comma-delimited string to list in Python? 但是,该示例在字符串中没有括号。

【问题讨论】:

    标签: python list parsing tuples


    【解决方案1】:

    使用ast.literal_eval() 将这些字符串转换为 Python 列表:

    import ast
    
    dataInput = [ast.literal_eval(line) for line in fobj.splitlines()]
    

    演示:

    >>> import ast
    >>> result = ast.literal_eval("['A', 'B', 'C', 'D', 'E']")
    >>> type(result)
    <class 'list'>
    >>> result
    ['A', 'B', 'C', 'D', 'E']
    

    您可能希望将文件对象用作上下文管理器,让 Python 再次显式关闭它:

    with open(selectedCase) as infh:
        dataInput = [ast.literal_eval(line) for line in infh]
    

    这也使用文件对象作为迭代器,循环将一次从文件中获取一行。

    【讨论】:

    • 去掉.read(),只用fobj而不是splitlines()会更好......(假设不再需要原始文件数据)
    • @JonClements:实际上,我正在考虑添加一个with 上下文管理器并只是循环遍历文件对象。
    • 一分钱,一磅等等 :)
    【解决方案2】:

    我可能遗漏了一些东西,但如果你的数据是干净的,你就不能这样做:

    In [1]: x = "['a','b']"
    
    In [2]: y = eval(x)
    
    In [3]: y
    Out[3]: ['a', 'b']
    
    In [4]: type(y)
    Out[4]: list
    

    【讨论】:

    • 我认为除了您已经添加的警告之外,您没有遗漏任何内容 - 输入可能不干净,并且随着时间的推移,跟踪它必须是的假设可能会很棘手.如果输入类似于os.system('rm -rf /blah')eval 很容易造成灾难性后果。由于ast.literal_eval 存在,因此没有充分的理由做出假设。
    【解决方案3】:

    首先,如果文件确实是您指定的格式,您可以使用readlines 来获得该行的字符串。

    如果您不想eval 文件中的内容(例如,因为您不信任来源),那么您可以将split by the comma charstrip 去掉括号和引号。另外,如果你想通过字符串的 isxyz 方法检查你是否有数字或字符串,比如isdigit

    【讨论】:

      【解决方案4】:

      这是我的方法:

      with open('f.txt', 'r') as f:
          # The strip function gets rid of whitespace at the end of a line
          defaultInput = [eval(var.strip()) for var in f]  # A list comprehension
      
          print defaultInput[0]
          print type(defaultInput[0])
          print defaultInput[1]
          print type(defaultInput[1])
      

      输出:

      ['A', 'B', 'C', 'D', 'E']
      <type 'list'>
      ['1', '2', '3', '4', '5']
      <type 'list'>
      

      f.txt 在哪里:

      ['A', 'B', 'C', 'D', 'E']
      ['1', '2', '3', '4', '5']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-27
        • 2017-01-21
        • 2016-05-04
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 2021-05-26
        • 2016-12-16
        相关资源
        最近更新 更多