Если вызов плагина jQuery находится рядом с </body>
, и ваш сценарий загружен до этого, вы должны сделать свой код запущенным после события window.onload
, например:
window.onload = function() {
//YOUR JQUERY CODE
}
`
, поэтому ваш код будет запускаться только после загрузки окна, когда все активы будут загружены. В этой точке будет определен jQuery ($
).
Если вы используете это:
$(document).ready(function () {
//YOUR JQUERY CODE
});
`
, $
isn 't еще не определено в это время, потому что он вызывается до загрузки jQuery, и ваш скрипт не будет работать в этой первой строке на консоли.
for line in reversed(open("filename").readlines()):
print line.rstrip()
И в Python 3:
for line in reversed(list(open("filename"))):
print(line.rstrip())
Правильный, эффективный ответ, написанный как генератор.
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
Здесь вы можете найти мою мою реализацию, вы можете ограничить использование 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
Как о чем-то вроде этого:
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
Поскольку файл читается символом по символу в обратном порядке, он будет работать даже на очень больших файлах, если отдельные строки вписываются в память.
Всегда используйте 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)
Если вас беспокоит размер файла / использование памяти, сопоставление памяти с файлом и сканирование назад для новых строк - это решение:
for line in reversed(open("file").readlines()):
print line.rstrip()
Если вы используете linux, вы можете использовать команду tac
.
$ tac file
2 рецепта, которые вы можете найти в ActiveState здесь и здесь
простая функция для создания второго файла (только для Linux):
import os
def tac(file1, file2):
print(os.system('tac %s > %s' % (file1,file2)))
как использовать
tac('ordered.csv', 'reversed.csv')
f = open('reversed.csv')
Я должен был сделать это некоторое время назад и использовал приведенный ниже код. Он подключается к оболочке. Боюсь, у меня больше нет полного скрипта. Если вы работаете в операционной системе 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)
def reverse_lines(filename):
y=open(filename).readlines()
return y[::-1]
Спасибо за ответ @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], полностью изменяя файл. Вы также можете использовать 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])
Вы также можете использовать модуль 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