Home > Backend Development > Python Tutorial > How Can I Efficiently Read a Large File in Reverse Order Using Python?

How Can I Efficiently Read a Large File in Reverse Order Using Python?

Susan Sarandon
Release: 2024-11-25 09:59:11
Original
629 people have browsed it

How Can I Efficiently Read a Large File in Reverse Order Using Python?

Reading a File in Reverse Order in Python

If you're working with a large file and need to read its contents from the last line to the first, Python's built-in functions may not be suitable. Here's an efficient solution to tackle this task:

Reverse Line Reader Generator

The following code defines a generator function, reverse_readline, which yields the lines of a file in reverse order. It uses a buffer-based approach to optimize performance and handle large files effectively:

import os

def reverse_readline(filename, buf_size=8192):
    """A generator that returns the lines of a file in reverse order"""
    with open(filename, 'rb') as fh:
        segment = None
        offset = 0
        fh.seek(0, os.SEEK_END)
        file_size = remaining_size = fh.tell()
        while remaining_size > 0:
            offset = min(file_size, offset + buf_size)
            fh.seek(file_size - offset)
            buffer = fh.read(min(remaining_size, buf_size))
            # remove file's last "\n" if it exists, only for the first buffer
            if remaining_size == file_size and buffer[-1] == ord('\n'):
                buffer = buffer[:-1]
            remaining_size -= buf_size
            lines = buffer.split('\n'.encode())
            # append last chunk's segment to this chunk's last line
            if segment is not None:
                lines[-1] += segment
            segment = lines[0]
            lines = lines[1:]
            # yield lines in this chunk except the segment
            for line in reversed(lines):
                # only decode on a parsed line, to avoid utf-8 decode error
                yield line.decode()
        # Don't yield None if the file was empty
        if segment is not None:
            yield segment.decode()
Copy after login

Usage:

To use this generator, you can simply iterate over it in a for loop:

for line in reverse_readline('myfile.txt'):
    print(line)
Copy after login

This will print the lines of the file in reverse order.

The above is the detailed content of How Can I Efficiently Read a Large File in Reverse Order Using Python?. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template