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
Lepaskan: 2024-12-17 20:01:11
asal
663 orang telah melayarinya

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
Salin selepas log masuk

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:])
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan