Прочитать файл в обратном порядке, используя python - PullRequest
101 голосов
/ 20 февраля 2010

Как прочитать файл в обратном порядке, используя python? Я хочу прочитать файл с последней строки до первой.

Ответы [ 18 ]

1 голос
/ 08 февраля 2018

Если вас беспокоит размер файла / использование памяти, решение проблемы может быть связано с отображением памяти в файле и сканированием назад для новых строк:

Как искать строку в текстовых файлах?

0 голосов
/ 11 сентября 2018

Большинство ответов нужно прочитать весь файл, прежде чем что-либо делать. Этот образец читает все более крупные образцы с конца .

Я видел только ответ Мурата Юкселена, когда писал этот ответ. Это почти то же самое, что я думаю, это хорошо. Пример ниже также имеет дело с \ r и увеличивает его размер буфера на каждом шаге. У меня также есть несколько модульных тестов для поддержки этого кода.

def readlines_reversed(f):
    """ Iterate over the lines in a file in reverse. The file must be
    open in 'rb' mode. Yields the lines unencoded (as bytes), including the
    newline character. Produces the same result as readlines, but reversed.
    If this is used to reverse the line in a file twice, the result is
    exactly the same.
    """
    head = b""
    f.seek(0, 2)
    t = f.tell()
    buffersize, maxbuffersize = 64, 4096
    while True:
        if t <= 0:
            break
        # Read next block
        buffersize = min(buffersize * 2, maxbuffersize)
        tprev = t
        t = max(0, t - buffersize)
        f.seek(t)
        lines = f.read(tprev - t).splitlines(True)
        # Align to line breaks
        if not lines[-1].endswith((b"\n", b"\r")):
            lines[-1] += head  # current tail is previous head
        elif head == b"\n" and lines[-1].endswith(b"\r"):
            lines[-1] += head  # Keep \r\n together
        elif head:
            lines.append(head)
        head = lines.pop(0)  # can be '\n' (ok)
        # Iterate over current block in reverse
        for line in reversed(lines):
            yield line
    if head:
        yield head
0 голосов
/ 07 июня 2018

вам нужно будет сначала открыть ваш файл в формате чтения, сохранить его в переменную, а затем открыть второй файл в формате записи, в который вы бы записали или добавили переменную, используя срез [:: - 1], полностью перевернув файл. Вы также можете использовать readlines (), чтобы превратить его в список строк, которыми вы можете манипулировать

def copy_and_reverse(filename, newfile):
    with open(filename) as file:
        text = file.read()
    with open(newfile, "w") as file2:
        file2.write(text[::-1])
0 голосов
/ 13 ноября 2015
def reverse_lines(filename):
    y=open(filename).readlines()
    return y[::-1]
0 голосов
/ 20 февраля 2010

Я должен был сделать это некоторое время назад и использовал приведенный ниже код. Это трубы в оболочку. Боюсь, у меня больше нет полного сценария. Если вы работаете в unixish операционной системе, вы можете использовать «tac», например, например, Команда Mac OSX tac не работает, используйте tail -r. Приведенный ниже фрагмент кода проверяет, на какой платформе вы находитесь, и соответствующим образом корректирует команду

# We need a command to reverse the line order of the file. On Linux this
# is 'tac', on OSX it is 'tail -r'
# 'tac' is not supported on osx, 'tail -r' is not supported on linux.

if sys.platform == "darwin":
    command += "|tail -r"
elif sys.platform == "linux2":
    command += "|tac"
else:
    raise EnvironmentError('Platform %s not supported' % sys.platform)
0 голосов
/ 29 ноября 2018

Читайте файл построчно, а затем добавляйте его в список в обратном порядке.

Вот пример кода:

reverse = []
with open("file.txt", "r") as file:
    for line in file:
        line = line.strip()
         reverse[0:0] = line
0 голосов
/ 04 декабря 2018
import sys
f = open(sys.argv[1] , 'r')
for line in f.readlines()[::-1]:
    print line
0 голосов
/ 02 августа 2016

Всегда используйте with при работе с файлами, поскольку он обрабатывает все для вас:

with open('filename', 'r') as f:
    for line in reversed(f.readlines()):
        print line

Или в Python 3:

with open('filename', 'r') as f:
    for line in reversed(list(f.readlines())):
        print(line)
...