Python中的问题,只有一行写入文件

时间:2011-08-09 14:23:57

标签: python python-3.x

我正在尝试在Python 3中编写一个函数,它将所有以字符串'halloween'结尾的行写入文件。当我调用这个函数时,我只能得到一行写入输出文件(file_2.txt)。任何人都可以指出我的问题在哪里?提前致谢。

def parser(reader_o, infile_object, outfile_object):
    for line in reader_o:
        if line.endswith('halloween'):
            return(line)

with open("file_1.txt", "r") as file_input:
    reader = file_input.readlines()
    with open("file_2.txt", "w") as file_output:
        file_output.write(parser(reader))

3 个答案:

答案 0 :(得分:5)

def parser(reader_o):
    for line in reader_o:
        if line.rstrip().endswith('halloween'):
            yield line

with open("file_1.txt", "r") as file_input:
    with open("file_2.txt", "w") as file_output:
        file_output.writelines(parser(file_input))

这称为generator。它也可以写成表达式而不是函数:

with open("file_1.txt", "r") as file_input:
    with open("file_2.txt", "w") as file_output:
        file_output.writelines(line for line in file_input if line.rstrip().endswith('halloween'))

如果您使用的是Python 2.7 / 3.2,则可以执行以下两个with

with open("file_1.txt", "r") as file_input, open("file_2.txt", "w") as file_output:

您不需要对文件执行readlines(),只是告诉循环迭代打开的文件本身也会做同样的事情。

你的问题是return总是会在第一场比赛中退出循环。 yield停止循环,传出值,然后可以从同一点再次启动生成器。

答案 1 :(得分:0)

line.endswith('halloween')可能只适用于文件的最后一个,因为所有其他行都会附加换行符。先rstrip行。另外,请使用yield代替return

if line.rstrip().endswith('halloween'):
    yield line

请注意,这也会删除行尾的空格,这可能是您想要的,也可能不是。

您还必须将您的消费者修改为

with open("file_2.txt", "w") as file_output:
    for ln in parser(reader):
        file_output.write(ln)

答案 2 :(得分:0)

也许你的解析器函数应该是一个生成器。目前它只被调用一次并返回其中包含“万圣节”的第一行。

如下所示:

def parser(reader_o):
    for line in reader_o:
        if line.endswith('halloween'):
            yield line

with open("file_1.txt", "r") as file_input:
    with open("file_2.txt", "w") as file_output:
        file_output.writelines(parser(file_input))