Skip dulu beberapa baris saat membaca baris-baris dalam file Python

Aku ingin melewatkan 17 pertama garis saat membaca file teks.

Let's mengatakan berkas tersebut terlihat seperti:

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

Aku hanya ingin hal-hal yang baik. Apa yang saya'm melakukan lebih banyak lebih rumit, tapi ini adalah bagian I'm memiliki masalah dengan.

Mengomentari pertanyaan (1)
Larutan

Menggunakan sepotong, seperti di bawah ini:

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

Jika file terlalu besar untuk muat di memori:

with open('yourfile.txt') as f:
    for _ in range(17):
        next(f)
    for line in f:
        # do stuff
Komentar (5)

Gunakan itertools.islice, mulai dari indeks 17. Maka secara otomatis akan melewatkan 17 baris pertama.

import itertools
with open('file.txt') as f:
    for line in itertools.islice(f, 17, None):  # start=17, stop=None
        # process lines
Komentar (1)
for line in dropwhile(isBadLine, lines):
    # process as you see fit

Lengkap demo:

from itertools import *

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

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

Keuntungan: Ini adalah mudah extensible untuk kasus-kasus di mana anda awalan garis-garis yang lebih rumit dari "0" (tetapi tidak saling bergantung).

Komentar (0)

Solusi ini membantu saya untuk melewati jumlah garis-garis yang ditentukan oleh linetostart variabel. Anda mendapatkan index (int) dan garis (string) jika anda ingin melacak orang-orang juga. Dalam kasus anda, anda mengganti linetostart dengan 18, atau menetapkan 18 untuk linetostart variabel.

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

Berikut adalah metode untuk mendapatkan garis antara dua nomor baris dalam sebuah file:


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
Komentar (0)

Jika itu's atas meja.

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

Komentar (0)

Jika anda don't ingin membaca seluruh file ke memori sekaligus, anda dapat menggunakan beberapa trik:

Dengan berikutnya(iterator) anda dapat maju ke baris berikutnya:

with open("filename.txt") as f:
     next(f)
     next(f)
     next(f)
     for line in f:
         print(f)

Tentu saja, ini cukup jelek, jadi itertools memiliki cara yang lebih baik untuk melakukan hal ini:

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)
Komentar (0)

Berikut ini adalah waktuhal hasil bagi atas 2 jawaban. Perhatikan bahwa "berkas.txt" adalah file teks yang berisi lebih dari 100.000 baris string acak dengan ukuran file 1MB+.

Menggunakan 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

Menggunakan dua loop:

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

jelas itertools metode ini lebih efisien ketika berhadapan dengan file besar.

Komentar (0)

Anda dapat menggunakan Daftar-Pemahaman untuk membuat sebuah one-liner:

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

Lebih lanjut tentang daftar pemahaman di PEP 202 dan di Python dokumentasi.

Komentar (4)