на основе gnibbler топ проголосовали ответ (20 Nov '09 в 0:27): этот класс добавить головку() и хвост() для файл ob ект.
class File(file):
def head(self, lines_2find=1):
self.seek(0) #Rewind file
return [self.next() for x in xrange(lines_2find)]
def tail(self, lines_2find=1):
self.seek(0, 2) #go to end of file
bytes_in_file = self.tell()
lines_found, total_bytes_scanned = 0, 0
while (lines_2find+1 > lines_found and
bytes_in_file > total_bytes_scanned):
byte_block = min(1024, bytes_in_file-total_bytes_scanned)
self.seek(-(byte_block+total_bytes_scanned), 2)
total_bytes_scanned += byte_block
lines_found += self.read(1024).count('\n')
self.seek(-total_bytes_scanned, 2)
line_list = list(self.readlines())
return line_list[-lines_2find:]
Использование:
f = File('path/to/file', 'r')
f.head(3)
f.tail(3)
Спасибо, это очень полезно. Какая разница между двумя? (с точки зрения производительности, требуемых библиотек, совместимости и т. д.)? – Russell
Я ожидаю, что производительность будет одинаковой, возможно, первая будет немного быстрее. Но первый не будет работать, если файл не имеет не менее N строк. Лучше всего измерить производительность по сравнению с некоторыми типичными данными, с которыми вы будете их использовать. –
Оператор with работает на Python 2.6 и требует дополнительного оператора импорта на 2.5. Для версии 2.4 или более ранней версии вам потребуется переписать код с помощью try ... except block. Стилистически, я предпочитаю первый вариант, хотя, как уже упоминалось, второй более надежный для коротких файлов. – Alasdair