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.
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
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
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).
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
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<=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']
Sebut saja dengan satu parameter dari baris n -> EOF
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)
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.