.readlines()[n]出错

时间:2016-10-12 11:22:14

标签: python python-3.x while-loop

我是Python的初学者。 我试图解决问题:"如果我们有一个包含< 1000行的文件,如何只打印奇数行? &#34 ;.那是我的代码:

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 识别为计数器?

4 个答案:

答案 0 :(得分:2)

您可以将readlines调用到循环中,但这不是它的预期用途, 因为readlines一次摄取整个文件,所以返回一个LIST 换行符终止字符串。

您可能希望保存此类列表并对其进行操作

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

两个评论:

  1. odd1之间交替(因此当if的参数为真时)或0(因此if的参数时为假),< / LI>
  2. end=''函数的可选参数print是必需的,因为list_of_lines中的每一行都以新行符号终止,如果省略可选参数print函数将在每行的末尾输出一个新的第二行字符。
  3. 回到您的代码,您可以使用

    修复其行为
    f.seek(0)
    

    在循环之前将文件倒回到其起始位置并使用 循环内部f.readline()(看,它是非readline**S**)方法, 但请放心,像这样的程序是。让我们说,有点不同寻常......

    最终,您可以使用单行

    完成所需的一切
    print(''.join(open(filename).readlines()[::2]))
    

    使用slice notation for liststring method .join()

答案 1 :(得分:0)

好吧,我个人这样做:

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')

请注意,这将留下一个空行而不是偶数。我确定你想办法摆脱它。

答案 2 :(得分:0)

此代码完全按照您的要求执行:

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都是奇数,你都会浏览整个文件。通过它会更快(就像在你的问题中提供的解决方案一样)。

答案 3 :(得分:0)

作为修复,您需要输入

f.close()
f = open(r'C:\Users\Savina\Desktop\rosalind_ini5.txt')

每次阅读完文件后,都要回到起点。

作为旁注,你应该查找modolus%来查找奇数。