Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Saya Boleh Mendapatkan Kembali Baris N Terakhir Fail dalam Python (dengan Sokongan Offset) dengan Cekap?

Bagaimanakah Saya Boleh Mendapatkan Kembali Baris N Terakhir Fail dalam Python (dengan Sokongan Offset) dengan Cekap?

Barbara Streisand
Barbara Streisandasal
2024-12-17 20:01:11587semak imbas

How Can I Efficiently Retrieve the Last N Lines of a File in Python (with Offset Support)?

Dapatkan N Baris Terakhir Fail, Serupa dengan Ekor

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:

  1. Ia membaca n baris dari bahagian bawah fail.
  2. Ia menyediakan parameter ofset untuk melangkau bilangan baris tertentu dari bawah.
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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn