&引用;列表索引超出范围“;尝试使用python从文本文件输出行时
我试图从文本文件中提取偶数行并输出到新文件。但在我的代码中,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
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))