如何根据文件内容重新创建浮动列表列表?

How can I recreate a list of list of floats from the contents of a file?

我有一个文本文件 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']]

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

由于您的数据格式与将浮点数列表打印为字符串时的格式相同,您可以使用 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. You can read more about the with statement, here, here and here.


你的方法的实际问题是,

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

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

当你尝试时

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

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

对于文本文件中的每一行,首先需要去掉方括号,然后在 ", " 上拆分字符串(这里是 space 中间),然后在拆分之后获取字符串列表,然后您需要将这些字符串转换为浮点数,为此您可以使用 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

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

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 的列表。