Я думаю, что Вы могли использовать фактическое пространство или вкладку непосредственно в XML-документе, но если Вы ищете специальные символы для представления их так, чтобы текстовые процессоры не могли испортить их, затем это:
space =  
tab = 	
Если это правда, это звучит как ошибка или ограничение модуля кодеков, поскольку это, вероятно, сбивает с толку смещения байтов и символов.
Я бы использовал обычный open ()
для открытия файла, затем seek ()
/ tell ()
даст вам всегда согласованные смещения байтов. Всякий раз, когда вы хотите читать, используйте f.readline (). Decode ('utf-8')
.
Однако помните, что использование функции f.read ()
может вы окажетесь в середине многобайтового символа, что приведет к ошибке декодирования UTF-8. readline ()
будет работать всегда.
Это не обрабатывает метку порядка байтов для вас прозрачно, но есть вероятность, что ваши файлы журналов все равно не имеют спецификаций.
Для UTF-8 вам не нужно открывать файл с помощью codecs.open. Вместо этого надежно сначала прочитать файл как байтовую строку и только затем декодировать отдельный раздел (вызывая метод .decode для строки). Разрыв файла по границам строки безопасно; единственный небезопасный способ разбить его - это посередине многобайтового символа (который вы можете узнать по его байтовому значению> 128).
Многое из того, что происходит с UTF8 в python, имеет смысл, если вы посмотрите, как это было сделано в Python 3. В вашем случае это будет иметь немного больше смысла, если вы прочитаете Глава о файлах в Dive into Python 3: http://diveintopython3.org/files.html
Однако вкратце это file.seek
и file.tell.
работают с позициями байтов, тогда как символы Юникода могут занимать несколько байтов. Таким образом, если вы это сделаете:
f.seek(10)
f.read(1)
f.tell()
Вы можете легко получить что-то другое, кроме 17
, в зависимости от того, какой длины был один прочитанный символ.
Обновление: вы не можете искать / определять объект, возвращаемый codec.open (). Вам нужно использовать обычный файл и декодировать строки в Unicode после прочтения.
Я не знаю, почему это не работает, но я не могу заставить его работать. Например, поиск работает только один раз. Затем вам нужно закрыть и снова открыть файл, что, конечно, бесполезно.
Tell не использует позиции символов, но не показывает вам, где находится ваша позиция в потоке (но, вероятно, где находится базовый объект файла. при чтении с диска)
Так что, вероятно, вы не можете этого сделать из-за какой-то базовой буферизации. Но декодирование после чтения работает отлично, так что сделайте это.