我正在尝试创建一个以打开文件作为参数的函数,读取文件中的整数,这些整数都在各自的行上,然后创建这些整数的列表。当空行时,该函数应停止读取文件。这就是我所坚持的。
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:'应该'
答案 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())))