如何逐行读取文件,每行作为浮点数列表?
我有一个文件,每一行都有一对坐标,格式是这样的:
[-74.0104294, 40.6996416]
我用来读取这些坐标的代码是:
with open('Manhattan_Coords.txt', 'r') as f:
mVerts = f.read().splitlines()
这段代码把所有78行都读进了一个列表里,但它们被当作字符串读取,所以当我打印出来时,显示的内容是:
['[(-74.0104294, 40.6996416]', ... , '[-74.0104294, 40.6996416]']
(想象一下...后面还有76个坐标,和第一个和最后一个一样)
我该怎么做才能把这些坐标对读成一个列表,这样我就能得到一个包含78个子列表的列表,每个子列表里有两个浮点数?
2 个回答
0
比起@ZeroPiraeus的解决方案,还有更好的方法,那就是使用ast.literal_eval。这个方法可以评估任何Python的字面量(在这里是一个由浮点数构成的列表字面量)。
import ast
m_verts = []
with open('Manhattan_Coords.txt') as f:
for line in f:
pair = ast.literal_eval(line)
m_verts.append(pair)
不过,如果要构建这个列表,使用列表推导式会更好。
import ast
with open('Manhattan_Coords.txt') as f:
m_verts = [ast.literal_eval(line) for line in f]
1
对于每一行,你需要:
- 读取它
... 使用一个for
循环来逐行读取文件 - 去掉空白字符,包括换行符
... 使用str.strip()
- 去掉首尾的字符(括号)
... 使用 字符串切片:[1:-1]
- 根据子字符串
', '
分割
... 使用str.split()
和一个 列表推导式。 - 将结果字符串转换为浮点数
... 使用float()
- 将每对浮点数添加到一个列表中
... 使用list.append()
这看起来像这样:
m_verts = []
with open('Manhattan_Coords.txt') as f:
for line in f:
pair = [float(s) for s in line.strip()[1:-1].split(", ")]
m_verts.append(pair)
之后,m_verts
看起来像这样:
>>> m_verts
[[-74.0104294, 40.6996416], ... ]
一般来说,逐行读取文件比一次性用 splitlines()
方法读取到列表中要好... 这样更易读,而且对于大文件来说效率更高。
另外,注意我用的是更符合 Python 风格的 under_score 命名方式来命名 m_verts
,而不是你的 camelCase 风格 - 并且在打开文件进行读取时不需要指定 'r'
。