如何逐行读取我的文件作为浮动列表?

时间:2014-09-07 18:41:48

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

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

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

2 个答案:

答案 0 :(得分:0)

对于每一行,您需要:

  1. 阅读
    ...使用for循环迭代文件
  2. 剥离空格,包括换行符
    ......使用str.strip()
  3. 丢失第一个和最后一个字符(括号)
    ...使用string slicing[1:-1]
  4. 拆分子字符串', '
    ...使用str.split()list comprehension
  5. 将生成的字符串转换为浮点数
    ......使用float()
  6. 将每对浮点数添加到列表中
    ......使用list.append()
  7. 看起来像这样:

    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()这样的方法将它们全部读入列表......它更具可读性,并且大文件效率更高。

    另外,请注意我使用了更多的pythonic under_score 样式来命名m_verts,而不是你的 camelCase 样式 - 并且&# 39;打开文件进行阅读时无需指定'r'

答案 1 :(得分:0)

甚至比@ZeroPiraeus解决方案更好的方法是使用ast.literal_eval,它可以评估python的任何文字(这里是float literal的列表文字复合词)

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]