【问题标题】:How can I read in my file line by line with each line as a list of floats?如何逐行读取文件中的每一行作为浮动列表?
【发布时间】:2014-09-07 18:41:47
【问题描述】:

我有一个文件,其中每一行都有一对坐标,如下所示:

[-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 个浮点数?

【问题讨论】:

  • '[(-74.0104294, 40.6996416]' 是不是打错字了?即,额外的左括号?

标签: python list file python-3.x file-io


【解决方案1】:

对于每一行,您需要:

  1. 阅读
    ... 使用 for 循环遍历文件
  2. 去除包括换行符在内的空格
    ...使用str.strip()
  3. 丢失第一个和最后一个字符(括号)
    ...使用string slicing[1:-1]
  4. 拆分子字符串', '
    ... 使用 str.split()list comprehension
  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 样式 - 并且没有必要指定 @ 987654335@打开文件读取时。

【讨论】:

  • @ZeroPiraeus 在我的回答中我使用了ast.literal_eval你可能不知道
【解决方案2】:

比@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]

【讨论】:

    猜你喜欢
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 2015-03-16
    • 1970-01-01
    • 2013-01-05
    • 2011-11-02
    • 1970-01-01
    相关资源
    最近更新 更多