Pengenalan
Analisis fail log selalunya melibatkan keupayaan untuk lihat entri terkini. Ini biasanya dicapai menggunakan arahan "ekor", yang mendapatkan semula n baris terakhir fail. Dalam artikel ini, kami akan meneroka pelaksanaan kaedah Python yang meniru perintah ekor, dengan sokongan untuk mengimbangi.
Pelaksanaan Ekor
Kaedah ekor() yang dicadangkan beroperasi seperti berikut:
def tail(f, n, offset=0): """Reads a n lines from f with an offset of offset lines.""" avg_line_length = 74 to_read = n + offset while 1: try: f.seek(-(avg_line_length * to_read), 2) except IOError: f.seek(0) pos = f.tell() lines = f.read().splitlines() if len(lines) >= to_read or pos == 0: return lines[-to_read:offset and -offset or None] avg_line_length *= 1.3
Kaedah ini menganggarkan purata panjang garisan dan melaraskannya secara dinamik untuk mengoptimumkan prestasi .
Pendekatan Alternatif
Pelaksanaan asal menjadikan andaian tentang panjang garisan, yang mungkin tidak selalunya benar. Berikut ialah pendekatan alternatif yang mengelakkan andaian sedemikian:
def tail(f, lines=20): total_lines_wanted = lines BLOCK_SIZE = 1024 f.seek(0, 2) block_end_byte = f.tell() lines_to_go = total_lines_wanted block_number = -1 blocks = [] while lines_to_go > 0 and block_end_byte > 0: if (block_end_byte - BLOCK_SIZE > 0): f.seek(block_number*BLOCK_SIZE, 2) blocks.append(f.read(BLOCK_SIZE)) else: f.seek(0,0) blocks.append(f.read(block_end_byte)) lines_found = blocks[-1].count('\n') lines_to_go -= lines_found block_end_byte -= BLOCK_SIZE block_number -= 1 all_read_text = ''.join(reversed(blocks)) return '\n'.join(all_read_text.splitlines()[-total_lines_wanted:])
Kaedah ini mencari ke belakang melalui fail satu blok pada satu masa, mengira pemisah baris untuk mencari baris yang dikehendaki.
Kesimpulan
Kedua-dua kaedah menyediakan penyelesaian yang berdaya maju untuk mendapatkan semula n baris terakhir fail dengan sokongan offset. Pendekatan alternatif mengelakkan andaian tentang panjang baris dan mungkin lebih cekap untuk fail besar.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mendapatkan Kembali Baris N Terakhir Fail dalam Python (dengan Sokongan Offset) dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!