我被要求从一个文件中读取行并将该文件中的每隔一行打印到另一个文件。这就是我到目前为止所做的。
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()
答案 0 :(得分:4)
from itertools import islice
with open('input') as fin, open('output', 'w') as fout:
fout.writelines(islice(fin, None, None, 2)
答案 1 :(得分:1)
这是一个相对简单的任务 - 您的主要问题是int()
的使用 - 您试图将整行转换为数字,然后失败。你想要做的是跟踪你所在的线路的数量。最简单的方法是使用the enumerate()
builtin。
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
语句 - 这会自动关闭文件,即使发生异常也会这样做,这是使用它的好习惯。它的可读性也更高。
答案 2 :(得分:0)
minimal 对您的程序进行更改以使其按照您的意愿执行操作,不会带来任何新概念:
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
而不是显式计数器,我要改变的第二件事是使用文件的write
方法而不是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错误),则文件对象不会被关闭。 1 with
语句告诉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的答案相同。 (Jon Clement的答案可能有点太聪明;他似乎是playing golf。)
1 在这段简单的代码中,如果发生异常,CPython的垃圾收集器将注意到文件对象不再可访问并将为您关闭它们,但是当你的程序变得更加复杂时,这不是可以依赖的东西。