Считайте файл в обратном порядке с помощью Python

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

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

4 ответа

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

И в Python 3:

for line in reversed(list(open("filename"))):
    print(line.rstrip())
69
ответ дан 24 November 2019 в 02:48
поделиться
for line in reversed(open("file").readlines()):
    print line.rstrip()

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

$ tac file

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

8
ответ дан 24 November 2019 в 02:48
поделиться

Мне пришлось сделать это некоторое время назад и я использовал приведенный ниже код. Он передает данные в оболочку. Боюсь, у меня больше нет полного сценария. Если вы работаете на 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
ответ дан 24 November 2019 в 02:48
поделиться
import re

def filerev(somefile, buffer=0x20000):
  somefile.seek(0, os.SEEK_END)
  size = somefile.tell()
  lines = ['']
  rem = size % buffer
  pos = max(0, (size // buffer - 1) * buffer)
  while pos >= 0:
    somefile.seek(pos, os.SEEK_SET)
    data = somefile.read(rem + buffer) + lines[0]
    rem = 0
    lines = re.findall('[^\n]*\n?', data)
    ix = len(lines) - 2
    while ix > 0:
      yield lines[ix]
      ix -= 1
    pos -= buffer
  else:
    yield lines[0]

with open(sys.argv[1], 'r') as f:
  for line in filerev(f):
    sys.stdout.write(line)
8
ответ дан 24 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

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