2012-03-06 43 views
36

Tôi muốn bỏ qua 17 dòng đầu tiên trong khi đọc một tệp văn bản.Bỏ qua vài dòng đầu tiên trong khi đọc các dòng trong tệp Python

Hãy nói rằng các tập tin trông giống như:

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

Tôi chỉ muốn những thứ tốt. Những gì tôi đang làm là phức tạp hơn nhiều, nhưng đây là phần tôi đang gặp rắc rối.

+0

http://stackoverflow.com/questions/620367/python-how-to-jump-to-a-particular-line-in-a-huge-text-file hoặc http://stackoverflow.com/questions/4796764/read-file-from-line-2-or-skip-header-row vv ..? –

Trả lời

70

Sử dụng một lát, như dưới đây

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

Nếu tập tin là quá lớn để nạp vào bộ nhớ:

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

Chỉ cần ghi nhớ rằng đây là một ý tưởng tồi nếu tập tin lớn, vì nó đọc nó hoàn toàn trong bộ nhớ –

+3

Giải pháp bổ sung là giải pháp thứ hai hiệu quả bộ nhớ –

+1

là tốt nhất nhưng tại sao sử dụng xrange?nó không phải là một số lớn để bỏ qua –

0

Bạn có thể sử dụng một danh sách-Hiểu để làm cho nó một có thể:

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

Tìm hiểu thêm về list comprehensio n trong PEP 202 và trong Python documentation.

+1

không có ý nghĩa nhiều để lưu trữ những dòng trong danh sách mà sẽ chỉ nhận được rác thu thập được. – wim

+0

@wim: Chi phí bộ nhớ là tầm thường (và có thể không thể tránh khỏi việc bạn làm điều đó, vì bạn sẽ cần phải xử lý O (n) các dòng này trừ khi bạn bỏ qua một điểm tùy ý trong tệp); Tôi chỉ không nghĩ rằng nó rất dễ đọc. – ninjagecko

+1

Tôi đồng ý với @wim, nếu bạn đang vứt bỏ kết quả, hãy sử dụng vòng lặp. Toàn bộ điểm của việc hiểu danh sách là bạn * có nghĩa là * để lưu trữ danh sách; bạn có thể dễ dàng phù hợp với vòng lặp for trên một dòng. – 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

Dưới đây là một phương pháp để có được ranh giới giữa hai số dòng trong một tập tin:

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 

Output:

['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'] 

Chỉ cần gọi nó với một tham số để có được từ dòng n - > EOF

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

Bản trình diễn đầy đủ:

from itertools import * 

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

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

Ưu điểm: Điều này dễ dàng mở rộng cho trường hợp tiền tố của bạn phức tạp hơn "0" (nhưng không phụ thuộc lẫn nhau).

2

Giải pháp này đã giúp tôi bỏ qua số dòng được chỉ định bởi biến số linetostart. Bạn nhận được chỉ mục (int) và dòng (chuỗi) nếu bạn muốn theo dõi chúng. Trong trường hợp của bạn, bạn thay thế linetostart bằng 18, hoặc gán 18 cho biến linetostart.

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

Nếu đó là bảng.

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

Các vấn đề liên quan