Необходимость возникла при решении одной практической задачи: перед загрузкой из скрипта python новых записей в БД проверялась уникальность каждой записи. Проверка проводилась по хешам, которые списком хралились в текстовом файле. Природа записей была такова, что вероятность того, что проверяемая запись уже существует в БД уменьшалась со временем.
Очевидное решение быстрой проверки - сохранять хеш очередной записи (в том случае, если она уникальна) в начале файла. Однако python не дает простого решения для этой операции - такое сохранение возможно либо через предварительную загрузку списка в память, либо через соединение нескольких файлов, по умолчанию запись добавляется либо в конец файла, либо в произвольное место, затирая существующую информацию.
В итоге возникла идея написать функцию, возвращающую строки, начиная с конца файла. Сразу замечу, что функция писалась под конкретную задачу, поэтому имеет ограничение - длины всех строк имеют одинаковый размер (длина хеша).
Вот эта функция
def getStringFromEndFile(filename, string_len, delimiter_line_len=1, emty_line_in_end=False):
with codecs.open(filename, 'r', 'utf-8') as hk:
if emty_line_in_end:
hk.seek(0,2)
else:
hk.seek(1,2)
while hk.tell()>string_len:
hk.seek(-(string_len+delimiter_line_len),1)
yield hk.read(string_len)
hk.seek(-string_len,1)
параметры:
- filename - имя файла,
- string_len - длина строки,
- delimiter_line_len - длина разделителя: новая строка, любая последовательность символов, их комбинации, не важно что, лишь бы все разделитили имели одинаковую длину
- emty_line_in_end - заканчивается ли файл пустой строкой (True / False)
пример использования:
for line in getStringFromEndFile('/tmp/hash.key',3):
print line