Пропустить первые пару строк при чтении строк в файле Python - PullRequest
47 голосов
/ 06 марта 2012

Я хочу пропустить первые 17 строк при чтении текстового файла.

Скажем, файл выглядит так:

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

Я просто хочу хорошие вещи.То, что я делаю, намного сложнее, но это та часть, с которой у меня проблемы.

Ответы [ 9 ]

96 голосов
/ 06 марта 2012

Используйте ломтик, как показано ниже:

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
27 голосов
/ 06 марта 2012

Используйте 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
3 голосов
/ 07 мая 2012
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" (но не взаимозависимы).

2 голосов
/ 19 января 2016

Это решение помогло мне пропустить количество строк, указанное в переменной linetostart.Вы получаете индекс (int) и строку (string), если вы хотите отслеживать их тоже.В вашем случае вы заменяете linetostart на 18 или назначаете 18 для переменной linetostart.

f = open("file.txt", 'r')
for i, line in enumerate(f, linetostart):
    #Your code
0 голосов
/ 27 декабря 2018

Вот результаты для 2 лучших ответов. Обратите внимание, что «file.txt» - это текстовый файл, содержащий более 100 000 строк случайной строки с размером файла 1 МБ +.

Использование 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

Использование двух для циклов:

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 более эффективен при работе с большими файлами.

0 голосов
/ 14 апреля 2018

Если вы не хотите читать весь файл сразу в память, вы можете использовать несколько приемов:

С 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)
0 голосов
/ 28 августа 2016

Если это стол.

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

0 голосов
/ 06 марта 2012

Вот метод для получения строк между двумя номерами строк в файле:

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

0 голосов
/ 06 марта 2012

Вы можете использовать списочное понимание, чтобы сделать его однострочным:

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

Подробнее о понимании списков в PEP 202 и в документации Python .

...