-1

我被要求从一个文件中读取行并将该文件中的每一行打印到另一个文件。这就是我到目前为止所拥有的。

my_file = open("thisFile.txt", "r")
out_file = open("thatFile.txt", "w")

for line in my_file:
    line = int(line)
    if line%2 !=0:
        print(line,file=out_file)     

my_file.close()
out_file.close()
4

3 回答 3

4
from itertools import islice

with open('input') as fin, open('output', 'w') as fout:
    fout.writelines(islice(fin, None, None, 2)
于 2013-02-18T00:54:41.977 回答
1

这是一个相对简单的任务 - 你的主要问题是使用int()- 你试图将整行转换为一个数字,然后失败。您要做的是跟踪您所在的行号。最简单的方法是使用内置enumerate().

with open("thisFile.txt") as in_file, open("thatFile.txt") as out_file:
    for line_no, line in enumerate(in_file, start=1):
        if line_no % 2:
            out_file.write(line)

还要注意with这里语句的使用 - 这会自动关闭文件,并且即使发生异常也会这样做,使用它是一个好习惯。它的可读性也显着提高。

于 2013-02-18T00:54:01.773 回答
0

对您的程序进行最小的更改以使其执行您想要的操作,不引入任何新概念,如下所示:

my_file = open("thisFile.txt", "r")
out_file = open("thatFile.txt", "w")

i = 1
for line in my_file:
    if i % 2 != 0:
        print(line, file=out_file)
    i += 1

my_file.close()
out_file.close()

您的错误只是您认为int(line)会给您行号。实际所做的是尝试将每行的文本解释为整数,这不是您想要的。

现在,Python 的许多优点在于其庞大的有用函数库。上述方法有效,但没有充分利用该语言所提供的功能。我要更改的第一件事是使用enumerate而不是显式计数器,我要更改的第二件事是使用writefiles 的方法而不是print,我要更改的第三件事是利用“非零为真”规则:

my_file = open("thisFile.txt", "r")
out_file = open("thatFile.txt", "w")

for i, line in enumerate(my_file, start=1):
    if i % 2:
        out_file.write(line)

my_file.close()
out_file.close()

我说这行得通,但实际上它只有在出现问题时才有效。如果有任何东西引发异常(例如,如果发生 I/O 错误),则文件对象不会关闭。1with语句告诉 Python 确保文件被关闭,无论是否发生异常;这也方便地减少打字。

with open("thisFile.txt", "r") as my_file,
     open("thatFile.txt", "w") as out_file:
    for i, line in enumerate(my_file, start=1):
        if i % 2:
            out_file.write(line)

您可能会注意到这与 Lattyware 的回答相同。(乔恩克莱门特的回答可能有点聪明了;他似乎在打高尔夫球。)

1在这段简单的代码中,如果发生异常,CPython 的垃圾收集器注意到文件对象不再可访问,并将为您关闭它们,但随着您的程序变得更加复杂,这不是可以依赖的东西。

于 2013-02-18T01:12:54.227 回答