如何逐行读取文件,每行作为浮点数列表?

0 投票
2 回答
566 浏览
提问于 2025-04-20 07:45

我有一个文件,每一行都有一对坐标,格式是这样的:

[-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

对于每一行,你需要:

  1. 读取它
    ... 使用一个 for 循环来逐行读取文件
  2. 去掉空白字符,包括换行符
    ... 使用 str.strip()
  3. 去掉首尾的字符(括号)
    ... 使用 字符串切片: [1:-1]
  4. 根据子字符串 ', ' 分割
    ... 使用 str.split() 和一个 列表推导式
  5. 将结果字符串转换为浮点数
    ... 使用 float()
  6. 将每对浮点数添加到一个列表中
    ... 使用 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'

撰写回答