如何根据文件内容重新创建浮动列表列表?
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 的列表。
我有一个文本文件 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 的列表。