如何在python 3中编写每一行?

时间:2015-03-23 18:02:37

标签: python

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

我在审核考试时遇到过这段代码。有人可以告诉我为什么这段代码不起作用?提前致谢!

4 个答案:

答案 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},每行使用mapstr.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()     返回清单 这是正确的版本。谢谢!人