在读取 Python 文件中的行时,跳过前几行

在阅读文本文件时,我想跳过前17行。

假设文件是这样的:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
good stuff

我只想要好东西。我现在做的事情要复杂得多但这部分我就不太明白了。

189528 次浏览

使用一片,如下:

with open('yourfile.txt') as f:
lines_after_17 = f.readlines()[17:]

如果文件太大,无法在内存中加载:

with open('yourfile.txt') as f:
for _ in range(17):
next(f)
for line in f:
# do stuff

你可以使用列表理解来使它成为一句俏皮话:

[fl.readline() for i in xrange(17)]

更多关于列表内涵的资料。

使用 itertools.islice,从索引17开始。它会自动跳过前17行。

import itertools
with open('file.txt') as f:
for line in itertools.islice(f, 17, None):  # start=17, stop=None
# process lines

下面是一个获取文件中两个行号之间的行的方法:

import sys


def file_line(name,start=1,end=sys.maxint):
lc=0
with open(s) as f:
for line in f:
lc+=1
if lc>=start and lc<=end:
yield line




s='/usr/share/dict/words'
l1=list(file_line(s,235880))
l2=list(file_line(s,1,10))
print l1
print l2

产出:

['Zyrian\n', 'Zyryan\n', 'zythem\n', 'Zythia\n', 'zythum\n', 'Zyzomys\n', 'Zyzzogeton\n']
['A\n', 'a\n', 'aa\n', 'aal\n', 'aalii\n', 'aam\n', 'Aani\n', 'aardvark\n', 'aardwolf\n', 'Aaron\n']

只要用一个参数调用它,就可以从 n-> EOF 行获得

for line in dropwhile(isBadLine, lines):
# process as you see fit

完整演示:

from itertools import *


def isBadLine(line):
return line=='0'


with open(...) as f:
for line in dropwhile(isBadLine, f):
# process as you see fit

优点: 这很容易扩展到前缀行比“0”更复杂的情况(但不是相互依赖的)。

这个解决方案帮助我跳过了由 linetostart变量指定的行数。 如果您还想跟踪这些内容,那么可以获得 index (int)和 line (string)。 在您的例子中,您将 linetostart 替换为18,或将18赋给 linetostart 变量。

f = open("file.txt", 'r')
for i, line in enumerate(f, linetostart):
#Your code

如果是桌子的话。

pd.read_table("path/to/file", sep="\t", index_col=0, skiprows=17)

如果您不想一次将整个文件读入内存,可以使用一些技巧:

使用 next(iterator),您可以前进到下一行:

with open("filename.txt") as f:
next(f)
next(f)
next(f)
for line in f:
print(f)

当然,这有点难看,所以 itertools 有一个更好的方法:

from itertools import islice


with open("filename.txt") as f:
# start at line 17 and never stop (None), until the end
for line in islice(f, 17, None):
print(f)

下面是前两个答案的时间。注意,“ file.txt”是一个文本文件,包含100,000多行随机字符串,文件大小为1MB + 。

使用 itertools:

import itertools
from timeit import timeit


timeit("""with open("file.txt", "r") as fo:
for line in itertools.islice(fo, 90000, None):
line.strip()""", number=100)


>>> 1.604976346003241

使用两个 for 循环:

from timeit import timeit


timeit("""with open("file.txt", "r") as fo:
for i in range(90000):
next(fo)
for j in fo:
j.strip()""", number=100)


>>> 2.427317383000627

很明显,itertools 方法在处理大型文件时更有效。