【问题标题】:How can I recreate a list of list of floats from the contents of a file?如何从文件内容重新创建浮点列表?
【发布时间】:2015-08-05 12:37:21
【问题描述】:

我有一个文本文件 coords.txt,其中包含分隔行中的列表:

[0, 0.0, 0.0]
[0, 2.0, 1.0]
[0, 1.0, 4.0]

第一列是ID,第二列和第三列-坐标。

我想获得如下效果:

[[0, 0.0, 0.0], [0, 2.0, 1.0], [0, 1.0, 4.0]]

我试试代码:

file = open(coords.txt).read()
list = file.splitlines()

结果是:

['[0, 0.0, 0.0]', '[0, 2.0, 1.0]', '[0, 1.0, 4.0]']

我使用的另一种方式是:

file = open(cords.txt)
list= [line.translate(None, '[]').split('\n') for line in file.readlines()]

结果是:

[['0, 0.0, 0.0', ''], ['0, 2.0, 1.0', ''], ['0, 1.0, 4.0']]

如何获得预期结果(进入列表将字符串更改为浮点数)?

【问题讨论】:

    标签: python string list text split


    【解决方案1】:

    如果您不介意所有浮点数,您可以去掉 [] 和换行符,然后在逗号映射上拆分为浮点数:

    with open("in.txt") as f:
        data = [list(map(float, line.strip("[]\n").split(","))) for line in f]
        print(data)
        [[0.0, 0.0, 0.0], [0.0, 2.0, 1.0], [0.0, 1.0, 4.0]]
    

    或使用re 查找所有数字:

    import re
    with open("in.txt") as f:
        r = re.compile("\d+\.\d+|\d+")
        data = [list(map(float, r.findall(line)))for line in f]
        print(data)
    
        [[0.0, 0.0, 0.0], [0.0, 2.0, 1.0], [0.0, 1.0, 4.0]]
    

    使用翻译你会在删除, 后拆分[]

     data = [list(map(float, line.rstrip().translate(None,"[]").split(","))) for line in f]
    

    不相关但您不需要调用 readlines,您可以只遍历文件对象而不是不必要地创建带有 readlines 的列表。

    【讨论】:

      【解决方案2】:

      由于您的数据与将浮点列表打印为字符串时的格式相同,因此您可以使用ast.literal_eval 方法将其转换回实际列表,如下所示

      >>> import ast
      >>> with open("coords.txt") as input_file:
      ...     result = [ast.literal_eval(line) for line in input_file]
      ...     
      >>> result
      [[0, 0.0, 0.0], [0, 2.0, 1.0], [0, 1.0, 4.0]]
      

      我们用with语句打开文件,然后用for循环(for line in input_file)逐行读取文件中的行。我们在读取的行上执行ast.literal_eval,调用的结果存储在列表中,list comprehension。您可以阅读有关 with 语句的更多信息,hereherehere


      您的方法的实际问题是,

      file = open(coords.txt).read()
      list = file.splitlines()
      

      只会将整个内容作为单个字符串读取,然后将字符串拆分为换行符。但列表仍然只有字符串。

      当你尝试时

      file = open(cords.txt)
      list= [line.translate(None, '[]').split('\n') for line in file.readlines()]
      

      您刚刚从各个行中删除了[] 字符,并根据\n 拆分了行。您还没有尝试将它们转换回浮点数。它仍然只是字符串。

      【讨论】:

      • 反对者,请让我知道答案有什么问题。我会尝试修复它。如果有改进的方法,请提出建议。
      【解决方案3】:

      对于文本文件中的每一行,您首先需要去掉方括号,然后在", "(此处的空格中间)上拆分字符串,然后拆分后您会得到一个字符串列表,然后您需要将这些字符串转换为浮点数,您可以使用map() 函数。

      data = []
      with open("sample.txt", "r") as data_file:
          for line in data_file.readlines():
              line = line.strip()[1:-1]   #To remove the starting and ending braces
              data.append(map(float, line.split(", ")))
      
      print data
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-19
        • 2014-01-13
        • 1970-01-01
        • 1970-01-01
        • 2021-09-16
        • 1970-01-01
        • 2021-07-25
        相关资源
        最近更新 更多