我是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 识别为计数器?
答案 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
两个评论:
odd
在1
之间交替(因此当if
的参数为真时)或0
(因此if
的参数时为假),< / LI>
end=''
函数的可选参数print
是必需的,因为list_of_lines
中的每一行都以新行符号终止,如果省略可选参数print
函数将在每行的末尾输出一个新的第二行字符。回到您的代码,您可以使用
修复其行为f.seek(0)
在循环之前将文件倒回到其起始位置并使用
循环内部f.readline()
(看,它是非readline**S**
)方法,
但请放心,像这样的程序是。让我们说,有点不同寻常......
最终,您可以使用单行
完成所需的一切print(''.join(open(filename).readlines()[::2]))
答案 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%来查找奇数。