我是Python的初学者。我试图解决这个问题:“如果我们有一个包含<1000行的文件,如何只打印奇数行?”这是我的密码:
with open(r'C:\Users\Savina\Desktop\rosalind_ini5.txt')as f:
n=1
num_lines=sum(1 for line in f)
while n<num_lines:
if n/2!=0:
a=f.readlines()[n]
print(a)
break
n=n+2其中n是计数器,num_lines计算文件包含多少行。但是当我试图执行代码时,它说:
"a=f.readlines()[n]
IndexError: list index out of range"为什么它不承认n是一个计数器?
发布于 2016-10-12 12:05:30
您可以将readlines调用到一个循环中,但这不是它的预期用途,因为readlines同时接收整个文件,并返回一个以新行结尾的字符串的列表。
您可能希望保存这样的列表并对其进行操作。
list_of_lines = open(filename).readlines() # no need for closing, python will do it for you
odd = 1
for line in list_of_lines:
if odd : print(line, end='')
odd = 1-odd两点意见:
odd在1 (因此在if的参数为true )或0 (因此在if的参数为false )之间交替。print函数的可选参数print,因为list_of_lines中的每一行都由一个新的行字符终止,如果省略可选参数,print函数将在每一行末尾输出第二个新行字符。回到您的代码,您可以使用
f.seek(0)在循环之前,将文件回滚到它的起始位置,并在循环中使用f.readline() (瞧,它不是readline**S**)方法,但是请放心,像这样的过程是。比方说,有点不合常规.
最后,你可以用一条线来做任何你想做的事。
print(''.join(open(filename).readlines()[::2]))发布于 2016-10-12 11:32:08
好吧,我会亲自这样做:
def print_odd_lines(some_file):
with open(some_file) as my_file:
for index, each_line in enumerate(my_file): # keep track of the index of each line
if index % 2 == 1: # check if index is odd
print(each_line) # if it does, print it
if __name__ == '__main__':
print_odd_lines('C:\Users\Savina\Desktop\rosalind_ini5.txt')请注意,这将留下空行,而不是偶数。我相信你知道怎么摆脱它。
发布于 2016-10-12 11:33:32
此代码将完全按照您的要求执行:
with open(r'C:\Users\Savina\Desktop\rosalind_ini5.txt')as f:
for i, line in enumerate(f.readlines()): # Iterate over each line and add an index (i) to it.
if i % 2 == 0: # i starts at 0 in python, so if i is even, the line is odd
print(line)若要解释代码中发生的情况,请执行以下操作:
文件只能读取一次。在那之后,必须关闭并重新打开。
首先在num_lines=sum(1 for line in f)中遍历整个文件。现在,对象f是空的。
但是,如果n是奇数,则调用f.readlines()。这将再次遍历所有的行,但是在f中没有留下任何行。所以每次n是奇怪的时候,你都会查看整个文件。一次就更快了(就像为你的问题提供的解决方案一样)。
https://stackoverflow.com/questions/39997324
复制相似问题