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

时间:2015-05-23 15:32:48

标签: python string list text split

我有一个包含分隔行列表的文本文件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']]

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

3 个答案:

答案 0 :(得分: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拆分了该行。您仍然没有尝试将它们转换回浮点数。它仍然只是字符串。

答案 1 :(得分:1)

对于文本文件中的每一行,首先需要摆脱方括号,然后将字符串拆分为", "(此处空格中间),然后在拆分后得到字符串列表然后您需要将这些字符串转换为浮点数,您可以使用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

答案 2 :(得分: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的列表。