Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;列表索引超出范围“;尝试使用python从文本文件输出行时_Python_List_File Io_Indexing_Indexoutofrangeexception - Fatal编程技术网

&引用;列表索引超出范围“;尝试使用python从文本文件输出行时

&引用;列表索引超出范围“;尝试使用python从文本文件输出行时,python,list,file-io,indexing,indexoutofrangeexception,Python,List,File Io,Indexing,Indexoutofrangeexception,我试图从文本文件中提取偶数行并输出到新文件。但在我的代码中,python警告我“列表索引超出范围”。有人能帮我吗?谢谢~ 代码: 输出: 17 Traceback (most recent call last): File "./5", line 10, in <module> a = f.readlines()[1] IndexError: list index out of range 17 回溯(最近一次呼叫最后一次): 文件“/5”,第10行,在 a=f.rea

我试图从文本文件中提取偶数行并输出到新文件。但在我的代码中,python警告我“列表索引超出范围”。有人能帮我吗?谢谢~

代码:

输出:

17
Traceback (most recent call last):
  File "./5", line 10, in <module>
    a = f.readlines()[1]
IndexError: list index out of range
17
回溯(最近一次呼叫最后一次):
文件“/5”,第10行,在
a=f.readlines()[1]
索引器:列表索引超出范围
之后

num_lines = sum(1 for line in f)
f
中的文件指针位于文件末尾。因此,任何后续调用
f.readlines()
都会给出一个空列表。最简单的修复方法是返回文件的开头

但是,更好的解决方案是只读取文件一次,例如,使用获取
行及其索引
i

newline = []
for i, line in enumerate(f):
    if i % 2 == 0:
        newline.append(line)

在原始脚本中,您读取文件一次以扫描行数,然后(尝试)读取内存中的行,您不需要创建一个完整大小的列表,而不仅仅是使用
list扩展它。append
,您使用零初始化列表,这对包含字符串的列表没有意义,等等

因此,此脚本实现了您最初的想法,但更好、更简单、更快:

with open('input.txt', 'r') as inf, open('output.txt', 'w') as outf:
    for lineno, line in enumerate(inf, 1):
        if lineno % 2 == 0:
            outf.write(line)
具体地

  • 使用with语句打开文件,以便在 该块已退出
  • 边读边写
  • 由于行是以1为基础编号的,请使用起始值为1的枚举,以便真正获得偶数编号的行

您还可以使用
itertools.islice
方法:

from itertools import islice

with open('input') as fin, open('output', 'w') as fout:
    fout.writelines(islice(fin, None, None, 2))

这节省了模运算,并将行写入置于系统级别。

JonClements-在最佳情况下改进:D
from itertools import islice

with open('input') as fin, open('output', 'w') as fout:
    fout.writelines(islice(fin, None, None, 2))