Как считать файл в обратном порядке с помощью Python? Я хочу считать файл от последней строки до первой строки.
for line in reversed(open("filename").readlines()):
print line.rstrip()
И в Python 3:
for line in reversed(list(open("filename"))):
print(line.rstrip())
for line in reversed(open("file").readlines()):
print line.rstrip()
Если вы на linux, вы можете использовать команду tac
.
$ tac file
Мне пришлось сделать это некоторое время назад и я использовал приведенный ниже код. Он передает данные в оболочку. Боюсь, у меня больше нет полного сценария. Если вы работаете на 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)
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)