2012-03-06 7 views
36

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

Допустим, файл выглядит следующим образом:

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

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

+0

http://stackoverflow.com/questions/620367/python-how-to-jump-to-a-particular-line-in-a-huge-text-file или http://stackoverflow.com/questions/4796764/read-file-from-line-2-or-skip-header-row и т.д ..? –

ответ

70

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

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

Если файл слишком велик, чтобы загрузить в память:

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

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

+3

. Дополнительное решение - эффективнее с точки зрения памяти. –

+1

второе решение является лучшим, но зачем использовать xrange?это не большое число, чтобы пропустить –

0

Вы можете использовать список постижение, чтобы сделать это один -liner:

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

Подробнее о списке comprehensio n в PEP 202 и в Python documentation.

+1

не имеет смысла хранить эти строки в списке, который просто получит сбор мусора. – wim

+0

@wim: Накладные расходы на память являются тривиальными (и, вероятно, неизбежными, как вы это делаете, поскольку вам нужно будет выполнять O (n) обработку этих строк, если вы не пропустите произвольную точку в файле); Я просто не думаю, что это очень читаемо. – ninjagecko

+1

Я согласен с @wim, если вы выбрасываете результат, используйте цикл. Весь смысл понимания списка заключается в том, что вы * означали * для хранения списка; вы можете так же легко установить цикл for на одну строку. – David

15
import itertools 
with open('file.txt') as f: 
    for line in itertools.islice(f, 17, None): # start=17, stop=None 
     # process lines 
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'] 

Просто позвоните его с одним параметром, чтобы получить от линии п - > EOF

1
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

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

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

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

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

Смежные вопросы