С латиницей все нормально, указатель встает на нужную позицию.
С кириллицей - попа. Получается с количеством, умноженным на 2, но это же не решение, а говHок0д будет.
Например, такой код:
В файле f.txt содержимое "Привет, Мир!"
f = open('f.txt', 'r', encoding='utf-8')
f.seek(9)
print(f.read(3))
-- выведет ошибку вместо "Мир"
C
f.seek (14) - покажет нормально.
Есть в Python встроенное решение для работы с кириллицей?
(я думал, это только в "плохом" PHP такая попа с работой с кириллицей, но и в "хорошем" Пайтоне, оказывается, тоже, а mb_seek() тут нет.
Спасибо.
Читать весь файл в строку и уже из строки получить срез нужных символов.
Чтобы в колировке UTF-8 (в которой символ может занимать от 1 до 4 байт) попасть на нужный символ, надо получить все предшествующие этому символу данные.
Разумеется, файловые операции такое не умеют и местоположение символа надо искать другими способами.
В кодировке UTF-8 символы могут занимать несколько идущих подряд байт. Поэтому решение вида "а давайте я умножу индекс на 2" никуда не годятся. К счастью, символы, используемые для перевода строки, в UTF-8 выглядят точно так же, как и в ASCII, а сами значения байт, закрепленные за символами UTF-8, сделаны так, что возможна самосинхронизация. Т.е. если вы ткнете в произвольную позицию строки в кодировке UTF-8, и попадете в середину многобайтного символа, этот факт легко отследить и найти его конец. Из этого следует, что из общего метода "считаем все данные, а потом будем героически ползти до нужного нам символа" в ряде случаев возможны исключения, позволяющие очень сильно сократить время сканирования. Принципиальная возможность таких исключений обусловлена тем, что именно вам нужно. Например, если вам нужно разделить какую-то строку в UTF-8 на символы строго пополам, то вам так или иначе придется обработать все символы, чтобы понять, сколько их. А вот если вас устроит примерное разделение, то можно прыгнуть в середину, а потом доползти по байтам до следующего или предыдущего символа. Но вообще, на мой взгляд, Python далеко не самый удачный язык для таких вот выкрутасов.
Почему-то такое очевидное решение (считать все, а потом взять нужную строку) не пришло в голову )))
Да и вообще, я часто Ваши ответы в этом разделе вижу, Вы очень грамотный и квалицифированный программист.
Спасибо, что помогаете другим и отвечаете на вопросы!
Респект!