Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.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_File_Lines_Skip - Fatal编程技术网

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

在读取Python文件中的行时跳过前几行,python,file,lines,skip,Python,File,Lines,Skip,我想在阅读文本文件时跳过前17行 假设该文件看起来像: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 good stuff 我只想要好东西。我正在做的事情要复杂得多,但这是我遇到麻烦的部分。使用切片,如下所示: with open('yourfile.txt') as f: lines_after_17 = f.readlines()[17:] 如果文件太大,无法加载到内存中: with open('yourfile.txt') as f: for _

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

假设该文件看起来像:

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

我只想要好东西。我正在做的事情要复杂得多,但这是我遇到麻烦的部分。

使用切片,如下所示:

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)]
更多关于列表理解的信息,请参见。

使用,从索引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
只需使用一个参数调用它,即可从第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
变量指定的行数。 如果您还想跟踪索引(int)和行(string),那么就可以得到它们。 在您的情况下,可以将linetostart替换为18,或将18指定给linetostart变量

f = open("file.txt", 'r')
for i, line in enumerate(f, linetostart):
    #Your code
如果是一张桌子


pd.read\u table(“path/to/file”,sep=“\t”,index\u col=0,skiprows=17)

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

使用
next(迭代器)
可以前进到下一行:

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)

以下是前两个答案的timeit结果。请注意,“file.txt”是一个文本文件,包含100000多行随机字符串,文件大小为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方法更有效。

等…?将这些行存储在一个只会被垃圾收集的列表中没有多大意义。@wim:内存开销很小(无论您以何种方式执行,都可能不可避免,因为您需要执行O(n)处理这些行,除非您跳到文件中的任意点);我只是觉得它不太可读。我同意@wim,如果你要放弃结果,请使用循环。列表理解的全部要点是你想要存储列表;您可以很容易地在一行上安装for循环,或者在0内存数据块中使用生成器。我使用第二种解决方案读取一个文件末尾的10行,其中包含800万(8e6)行,耗时约22秒。对于这样长的文件(~250 MB),这仍然是首选的(=最快的)方式吗?我会使用
tail
来解决这个问题。@wim:我想tail在Windows上不起作用。此外,我并不总是想读最后10行。我想能在中间读出一些台词。(例如,如果我在同一个文件中~4e6行之后读取10行,则仍需要一半的时间,~11秒)问题是,您需要在行号~4e6之前读取整个内容,以便知道行分隔符字节的位置,否则您不知道已传递了多少行。没有办法神奇地跳转到一个行号~250 MB应该可以将整个文件读取到内存中,但这并不是特别大的数据。@获取最后一行这实际上不会跳过行,它只会偏移枚举计数器。
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