我想在阅读文本文件时跳过前17行。
假设该文件如下:
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
good stuff
我只想要好东西。我正在做的事情要复杂得多,但这是我遇到麻烦的部分。
答案 0 :(得分:94)
使用切片,如下所示:
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
答案 1 :(得分:26)
使用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
答案 2 :(得分:3)
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”(但不相互依赖)更复杂的情况,这很容易扩展。
答案 3 :(得分:2)
此解决方案帮助我跳过linetostart
变量指定的行数。
如果你想跟踪那些,你得到索引(int)和行(字符串)。
在您的情况下,您将linetostart替换为18,或将18分配给linetostart变量。
f = open("file.txt", 'r')
for i, line in enumerate(f, linetostart):
#Your code
答案 4 :(得分:0)
这是一种在文件中的两个行号之间获取行的方法:
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
答案 5 :(得分:0)
如果它是一张桌子。
pd.read_table("path/to/file", sep="\t", index_col=0, skiprows=17)
答案 6 :(得分:0)
如果您不想一次将整个文件读入内存,可以使用一些技巧:
使用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)
答案 7 :(得分:0)
以下是前2个答案的时间结果。请注意,“ 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方法更有效。
答案 8 :(得分:-1)
您可以使用List-Comprehension使其成为一行:
[fl.readline() for i in xrange(17)]
有关PEP 202和Python documentation中的列表理解的更多信息。