def every_second_line(report):
""" (Open File for reading) -> list of str
Return a list containing every second line (with leading and trailing
whitespace removed) in report, starting with the first line.
"""
list=[]
for line in report:
list.append(line.strip)
report.readline()
return list
我在审核考试时遇到过这段代码。有人可以告诉我为什么这段代码不起作用?提前致谢!
答案 0 :(得分:3)
对代码的最小更改只是将report.readline()
置于for
循环内。
for line in report:
lst.append(line.strip())
report.readline()
您也可以使用next(report)
(适用于所有迭代器,而不仅仅是文件对象)而不是report.readline()
。
请注意,如果您的文件行数为奇数,那么report.readline()
可能会引发StopIteration
错误(或EOFError
错误?)最好抓住它。
for line in report:
lst.append(line.strip())
try:
next(report)
except (StopIteration, EOFError): # because I don't remember which it throws
break # leave the for loop
或者正如JuniorCompressor在评论中指出的那样,你可以使用next
的可选参数来完全忽略
for line in report:
lst.append(line.strip())
next(report, None)
答案 1 :(得分:1)
您可以使用itertools.islice
切换为{2},每行使用map
到str.strip
:
from itertools import islice
with open(fle) as f:
print(list(map(str.strip,islice(f,0,None,2))))
如果你想要从第二个开始的每一秒的第二行开始:
print(list(map(str.strip,islice(f,1,None,2))))
根据您的规范,您打算打开一个我不认为您正在做的文件。
在你自己的代码中,如果你实际上已经传递了一个文件对象,你只需要在文件对象上调用next,然后用parens实际调用strip
:
lst=[]
for line in report:
lst.append(line.strip()) # to call strip you need parens
next(report,"")
return lst
如果您希望每隔一行从第二行开始,请将next
放在lst.append
之前。 next
采用默认值,因此我们传递一个空字符串以避免stopIteration错误,以防我们之前用完线路并仍然调用next。
答案 2 :(得分:0)
尝试此操作以获取列表中的每个2nd
元素:
for line in report[::2]:
如果你不想要1st line
for line in report[1::2]:
考虑report
是否为generator object
:
只需致电list
for line in list(report)[::2]:
如果报告必须充当generator
(巨大的文件),那么
try:
for x in report:
line = next(report)
list.append(line.strip()) #dont use list as variable name
except StopIteration:
pass
答案 3 :(得分:0)
列表= [] 对于报告中的行: list.append(line.strip()) report.readline() 返回清单 这是正确的版本。谢谢!人