.readlines()[n]错误

2024-10-01 15:37:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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_nulines计算文件包含的行数。 但当我试图执行代码时,它说:

^{pr2}$

为什么它不把n识别为计数器?在


Tags: 文件txtwith计数器openusersnumlines
3条回答

嗯,我个人会这样做:

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

请注意,这将留下空行而不是偶数。我相信你知道如何摆脱它。在

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

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是奇数时,你都会浏览整个文件。快速浏览一次(就像你的问题解决方案一样)。在

您已经将对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

两个备注:

  1. odd1(因此当if的参数时为true)或{}(因此当if的参数时为false)
  2. print函数的可选参数end=''是必需的,因为{}中的每一行都以新行字符结尾,如果省略可选参数,print函数将在每行末尾输出第二个新行字符。在

回到您的代码,您可以使用

^{pr2}$

在循环之前将文件倒带到其起始位置并使用 f.readline()(看,这不是readline**S**)循环内的方法, 但请放心,这样的程序是。比如说,有点不传统。。。在

最终,你可以用一个命令行来做任何你想做的事情

print(''.join(open(filename).readlines()[::2]))

它使用slice notation for lists和string method ^{}

相关问题 更多 >

    热门问题