Python:在文件中读取整数并将它们添加到列表中

时间:2017-12-09 22:15:57

标签: python

我正在尝试创建一个以打开文件作为参数的函数,读取文件中的整数,这些整数都在各自的行上,然后创建这些整数的列表。当空行时,该函数应停止读取文件。这就是我所坚持的。

def load_ints(file):
    lst = []
    x = 1
    while x == 1:
        for line in file:
            if len(line.strip()) != 0:
                load = line.split()
                load = [int(i) for i in load]
                lst = lst + load
            else:
                x = 2
        x = 2
    return lst

我正在测试的文件看起来像这样:

  1
  0
  -12
  53
  1078

  Should not be read by load_ints!
len(line.strip()) != 0:  

不起作用, 它目前给我一个ValueError:int()的无效文字,基数为10:'应该'

6 个答案:

答案 0 :(得分:3)

您需要在break

之后加x = 2
        else:
            x = 2
            break

否则,for循环将继续迭代文件。它已读取空白行,执行else条件,然后执行处理行。所以它试图处理'Should ...'行,并因为'Should ...'不是整数而失败。

另外,我不明白为什么你有while声明。 for循环应足以迭代文件并处理每一行,而我建议的break将在您点击空行时退出循环。

答案 1 :(得分:3)

其他答案已经指出了这个问题:在装入空行时你必须停止解析整数。

这是使用itertools.takewhile的单线程,在剥离线时停止产生空行&转换为整数:

import itertools

def load_ints(file):
    return [int(x) for x in itertools.takewhile(str.strip,file)]

结果:

[1, 0, -12, 53, 1078]

因此itertools.takewhile会对file行进行迭代,并在每一行上应用strip。如果结果为空字符串,则会停止迭代。否则它会继续,以便将该行转换为整数并添加到列表推导中。

在这些情况下你写的线越少,你用辅助变量创建的错误越少&的状态。

答案 2 :(得分:1)

当您阅读文件时,您会获得一台发电机。我们可以使用while循环一次向我们提供1行,并在满足条件时中断(行为空白),而不是将其全部读取到内存中。这应该是最有效的解决方案。

data = """\
1
2
-10
1241

Empty line above"""

with open("test.txt","w") as f:
    f.write(data)

with open("test.txt") as f:
    data = []
    while True:
        row = next(f).strip()
        try:
            data.append(int(row))
        # Break if ValueError is raised (for instance blank line or string)
        except ValueError:
            break

data

返回:

[1, 2, -10, 1241]

如果你想要一个紧凑的解决方案,我们可以使用itertools中的takewhile。但这不会处理任何错误。

from itertools import takewhile

with open("test.txt") as f:
    data = list(map(int,takewhile(lambda x: x.strip(), f)))

答案 3 :(得分:1)

我认为暂时没有必要。

def load_ints(file):
    lst = []
    for line in file:
        if len(line.strip()) != 0:
            load = line.split()
            load = [int(i) for i in load]
            lst.append(load)
        else:
            break

    return lst

答案 4 :(得分:0)

如果你想在行为空时停止阅读文件,你必须打破for循环:

def load_ints(file):
    lst = []
    for line in file:
        if len(line.strip()) != 0:
            load = line.split()
            load = [int(i) for i in load]
            lst = lst + load
        else:
            break
    return lst

答案 5 :(得分:0)

您还可以使用re模块:

import re
def load_ints(my_file):
    return list(map(int, re.findall('-?\d', my_file.read())))