Прочитайте строку строки за строкой, начиная с последней строки в первой строке (Python) [duplicate]

Если вызов плагина jQuery находится рядом с </body>, и ваш сценарий загружен до этого, вы должны сделать свой код запущенным после события window.onload, например:

window.onload = function() {
  //YOUR JQUERY CODE
}

`

, поэтому ваш код будет запускаться только после загрузки окна, когда все активы будут загружены. В этой точке будет определен jQuery ($).

Если вы используете это:

$(document).ready(function () {
  //YOUR JQUERY CODE
});

`

, $ isn 't еще не определено в это время, потому что он вызывается до загрузки jQuery, и ваш скрипт не будет работать в этой первой строке на консоли.

86
задан Nick Volynkin 14 April 2016 в 05:55
поделиться

13 ответов

for line in reversed(open("filename").readlines()):
    print line.rstrip()

И в Python 3:

for line in reversed(list(open("filename"))):
    print(line.rstrip())
57
ответ дан Matt Joiner 1 September 2018 в 05:42
поделиться

Правильный, эффективный ответ, написанный как генератор.

import os

def reverse_readline(filename, buf_size=8192):
    """a generator that returns the lines of a file in reverse order"""
    with open(filename) 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))
            remaining_size -= buf_size
            lines = buffer.split('\n')
            # the first line of the buffer is probably not a complete line so
            # we'll save it and append it to the last line of the next buffer
            # we read
            if segment is not None:
                # if the previous chunk starts right from the beginning of line
                # do not concact the segment to the last line of new chunk
                # instead, yield the segment first 
                if buffer[-1] is not '\n':
                    lines[-1] += segment
                else:
                    yield segment
            segment = lines[0]
            for index in range(len(lines) - 1, 0, -1):
                if len(lines[index]):
                    yield lines[index]
        # Don't yield None if the file was empty
        if segment is not None:
            yield segment
98
ответ дан Andomar 1 September 2018 в 05:42
поделиться

Здесь вы можете найти мою мою реализацию, вы можете ограничить использование ram, изменив «буферную» переменную, есть ошибка, что программа печатает пустую строку в начале.

А также ram использование может увеличиваться, если нет новых строк для более чем байтов в буфере, переменная «утечка» будет увеличиваться до тех пор, пока не увидит новую строку («\n»).

Это также работает для 16-гигабайтных файлов, которые больше, чем моя общая память.

import os,sys
buffer = 1024*1024 # 1MB
f = open(sys.argv[1])
f.seek(0, os.SEEK_END)
filesize = f.tell()

division, remainder = divmod(filesize, buffer)
line_leak=''

for chunk_counter in range(1,division + 2):
    if division - chunk_counter < 0:
        f.seek(0, os.SEEK_SET)
        chunk = f.read(remainder)
    elif division - chunk_counter >= 0:
        f.seek(-(buffer*chunk_counter), os.SEEK_END)
        chunk = f.read(buffer)

    chunk_lines_reversed = list(reversed(chunk.split('\n')))
    if line_leak: # add line_leak from previous chunk to beginning
        chunk_lines_reversed[0] += line_leak

    # after reversed, save the leakedline for next chunk iteration
    line_leak = chunk_lines_reversed.pop()

    if chunk_lines_reversed:
        print "\n".join(chunk_lines_reversed)
    # print the last leaked line
    if division - chunk_counter < 0:
        print line_leak
2
ответ дан Bekir Dogan 1 September 2018 в 05:42
поделиться

Как о чем-то вроде этого:

import os


def readlines_reverse(filename):
    with open(filename) as qfile:
        qfile.seek(0, os.SEEK_END)
        position = qfile.tell()
        line = ''
        while position >= 0:
            qfile.seek(position)
            next_char = qfile.read(1)
            if next_char == "\n":
                yield line[::-1]
                line = ''
            else:
                line += next_char
            position -= 1
        yield line[::-1]


if __name__ == '__main__':
    for qline in readlines_reverse(raw_input()):
        print qline

Поскольку файл читается символом по символу в обратном порядке, он будет работать даже на очень больших файлах, если отдельные строки вписываются в память.

16
ответ дан Berislav Lopac 1 September 2018 в 05:42
поделиться

Всегда используйте 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)
0
ответ дан Carlos Afonso 1 September 2018 в 05:42
поделиться

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

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

0
ответ дан Federico 1 September 2018 в 05:42
поделиться
for line in reversed(open("file").readlines()):
    print line.rstrip()

Если вы используете linux, вы можете использовать команду tac.

$ tac file

2 рецепта, которые вы можете найти в ActiveState здесь и здесь

8
ответ дан ghostdog74 1 September 2018 в 05:42
поделиться

простая функция для создания второго файла (только для Linux):

import os
def tac(file1, file2):
     print(os.system('tac %s > %s' % (file1,file2)))

как использовать

tac('ordered.csv', 'reversed.csv')
f = open('reversed.csv')
8
ответ дан jamylak 1 September 2018 в 05:42
поделиться

Я должен был сделать это некоторое время назад и использовал приведенный ниже код. Он подключается к оболочке. Боюсь, у меня больше нет полного скрипта. Если вы работаете в операционной системе 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)
-2
ответ дан jeorgen 1 September 2018 в 05:42
поделиться
def reverse_lines(filename):
    y=open(filename).readlines()
    return y[::-1]
0
ответ дан Kevin Guan 1 September 2018 в 05:42
поделиться

Спасибо за ответ @srohde. У этого есть небольшая ошибка проверки для символа новой строки с оператором 'is', и я не мог прокомментировать ответ с 1 репутацией. Кроме того, мне бы хотелось, чтобы файл был открыт снаружи, потому что это позволяет мне вставлять мои провалы для задач luigi.

То, что мне нужно было изменить, имеет форму:

with open(filename) as fp:
    for line in fp:
        #print line,  # contains new line
        print '>{}<'.format(line)

d любить меняться на:

with open(filename) as fp:
    for line in reversed_fp_iter(fp, 4):
        #print line,  # contains new line
        print '>{}<'.format(line)

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

def reversed_fp_iter(fp, buf_size=8192):
    """a generator that returns the lines of a file in reverse order
    ref: https://stackoverflow.com/a/23646049/8776239
    """
    segment = None  # holds possible incomplete segment at the beginning of the buffer
    offset = 0
    fp.seek(0, os.SEEK_END)
    file_size = remaining_size = fp.tell()
    while remaining_size > 0:
        offset = min(file_size, offset + buf_size)
        fp.seek(file_size - offset)
        buffer = fp.read(min(remaining_size, buf_size))
        remaining_size -= buf_size
        lines = buffer.splitlines(True)
        # the first line of the buffer is probably not a complete line so
        # we'll save it and append it to the last line of the next buffer
        # we read
        if segment is not None:
            # if the previous chunk starts right from the beginning of line
            # do not concat the segment to the last line of new chunk
            # instead, yield the segment first
            if buffer[-1] == '\n':
                #print 'buffer ends with newline'
                yield segment
            else:
                lines[-1] += segment
                #print 'enlarged last line to >{}<, len {}'.format(lines[-1], len(lines))
        segment = lines[0]
        for index in range(len(lines) - 1, 0, -1):
            if len(lines[index]):
                yield lines[index]
    # Don't yield None if the file was empty
    if segment is not None:
        yield segment
1
ответ дан Murat Yükselen 1 September 2018 в 05:42
поделиться

вам нужно сначала открыть файл в формате чтения, сохранить его в переменной, а затем открыть второй файл в формате записи, где вы будете писать или добавлять переменную, используя срез [:: - 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
ответ дан PawlakJ 1 September 2018 в 05:42
поделиться

Вы также можете использовать модуль python file_read_backwards.

После его установки через pip install file_read_backwards (v1.2.1) вы можете прочитать весь файл в обратном направлении (по линии) в памяти способ через:

#!/usr/bin/env python2.7

from file_read_backwards import FileReadBackwards

with FileReadBackwards("/path/to/file", encoding="utf-8") as frb:
    for l in frb:
         print l

Он поддерживает кодировки «utf-8», «latin-1» и «ascii».

Поддержка также доступна для python3. Дополнительную документацию можно найти на странице http://file-read-backwards.readthedocs.io/en/latest/readme.html

9
ответ дан user7321751 1 September 2018 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: