0

我试图从文本文件中提取偶数行并输出到新文件。但是用我的代码 python 警告我“列表索引超出范围”。任何人都可以帮助我吗?谢谢~

代码:

f = open('input.txt', 'r')
i = 0
j = 0 
num_lines = sum(1 for line in f)
newline = [0] * num_lines
print (num_lines)
for i in range(1, num_lines):
    if i % 2 == 0:
        newline[i] = f.readlines()[i]
            print i, newline[i]
    i = i + 1
f.close()
f = open('output.txt', 'w')
for j in range(0,num_lines):
    if j % 2 == 0:
        f.write(newline[j] + '\n')
    j = j + 1
f.close()

输出:

17
Traceback (most recent call last):
  File "./5", line 10, in <module>
    a = f.readlines()[1]
IndexError: list index out of range
4

3 回答 3

3

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

from itertools import islice

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

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

于 2014-07-15T10:06:14.067 回答
3

num_lines = sum(1 for line in f)

文件指针位于f文件末尾。因此,任何后续调用f.readlines()都会给出一个空列表。最小的修复是用于f.seek(0)返回到文件的开头。

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

newline = []
for i, line in enumerate(f):
    if i % 2 == 0:
        newline.append(line)
于 2014-07-15T07:41:56.580 回答
3

在您的原始脚本中,您读取文件一次以扫描行数,然后您(尝试)读取内存中的行,您不必要地创建一个完整大小的列表,而不是仅仅用 扩展它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 的枚举,以便您真正获得偶数行。
于 2014-07-15T07:53:03.943 回答