Я пытаюсь найти токен «: путь» в файле, а затем прочитать все следующие (произвольное количество цифр) числа как число (поэтому для «: путь, 123» я ищу в файле, затем читаю целое число 123). Затем прочитайте символы между текущей позицией поиска и pos+123 (сохраните их в списке или где-то еще). Затем выполните поиск до следующего совпадения для «: path» и повторите процесс.
Я хотел бы, чтобы функция была похожа на:
def fregseek(FILE, current_seek, /regex/): . . value_found = ? # result of reading next N chars after :path,[0-9]+ . . return next_start_seek, value_found
Может быть любое количество совпадений для ':path' в строке, и эта строка может встречаться в пределах количества символов, указанного после ','. Я написал беспорядочную кучу мусора, которая читается в каждой строке, затем для каждой строки жует первые N символов, указанных совпадением, затем продолжает обрабатывать строку, пока она не будет съедена полностью. Затем читает следующую строку и так далее.
Это ужасно, я не хочу вычерпывать все строки из потенциально огромного файла, когда все, что мне действительно нужно сделать, это искать (тем более, что новая строка не имеет значения, поэтому требуется дополнительный шаг обработки только потому, что строки легко найти). вытягивать из файлов смешно).
Так вот, это моя проблема, которую я хотел бы решить. Мне нужно найти совпадение, прочитать значение, продолжить с конца этого значения в поисках следующего совпадения и так далее, пока файл не будет исчерпан.
Если кто-то может помочь мне с этим, я буду рад услышать от них :)
Я хотел бы избегать нестандартных библиотек, если это возможно, я также хотел бы иметь самый короткий код, но это меньше всего меня беспокоит (скорость и потребление памяти являются важными факторами, но я не хочу 50 дополнительных лок только для загрузки некоторых библиотека с небольшой функциональностью, которую я мог бы просто выдрать, если бы только знал, что это такое).
Я бы предпочел код на python, однако, если perl превзойдет python в этом отношении, я буду использовать вместо него perl, я также открыт для умных сценариев sed/awk/bash и т. д., если они не будут ужасно медленнее.
Большое спасибо заранее.
str
/bytes
, но вместо этого использовали объектmmap
. - person abarnert   schedule 27.09.2012mmap
передf.read()
заключается в том, что на 64-битном Python он работает с большими файлами. (Кроме того, это, вероятно, будет быстрее, но насколько быстрее, трудно предположить, и не стоит пытаться угадать, когда можно просто протестировать.) Но если вам нужны большие файлы на 32-битном Python, этого недостаточно. Для этого используйте скользящее окно Google mmap, и вы должны найти несколько рецептов, которые делают то, что вам нужно (но не будут такими же эффективными, как обычный mmap, если вы можете его использовать). - person abarnert   schedule 27.09.2012