首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.readlines()[n]错误

.readlines()[n]错误
EN

Stack Overflow用户
提问于 2016-10-12 11:22:13
回答 4查看 1.3K关注 0票数 2

我是Python的初学者。我试图解决这个问题:“如果我们有一个包含<1000行的文件,如何只打印奇数行?”这是我的密码:

代码语言:javascript
复制
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计算文件包含多少行。但是当我试图执行代码时,它说:

代码语言:javascript
复制
"a=f.readlines()[n]
 IndexError: list index out of range"

为什么它不承认n是一个计数器?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-10-12 12:05:30

您可以将readlines调用到一个循环中,但这不是它的预期用途,因为readlines同时接收整个文件,并返回一个以新行结尾的字符串的列表。

您可能希望保存这样的列表并对其进行操作。

代码语言:javascript
复制
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 )或0 (因此在if的参数为false )之间交替。
  2. 需要print函数的可选参数print,因为list_of_lines中的每一行都由一个新的行字符终止,如果省略可选参数,print函数将在每一行末尾输出第二个新行字符。

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

代码语言:javascript
复制
f.seek(0)

在循环之前,将文件回滚到它的起始位置,并在循环中使用f.readline() (瞧,它不是readline**S**)方法,但是请放心,像这样的过程是。比方说,有点不合常规.

最后,你可以用一条线来做任何你想做的事。

代码语言:javascript
复制
print(''.join(open(filename).readlines()[::2]))

,它使用slice notation for list.join()

票数 2
EN

Stack Overflow用户

发布于 2016-10-12 11:32:08

好吧,我会亲自这样做:

代码语言:javascript
复制
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')

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

票数 0
EN

Stack Overflow用户

发布于 2016-10-12 11:33:32

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

代码语言:javascript
复制
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是奇怪的时候,你都会查看整个文件。一次就更快了(就像为你的问题提供的解决方案一样)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39997324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档