Я спросил (в комментарии) "" "Покажите нам вывод из print repr (weird_special_characters). Когда вы открываете файл в vim, ЧТО правильно? Пожалуйста, будьте более точными, чем" странно отформатированный "." "" Но ничего: - (
Какой файл вы смотрите с od
? file.gz
?? Если вы видите там что-то узнаваемое, это не файл gzip! Вы не видите новые строки, вы видите двоичные байты, которые содержат 0x0A.
Если исходный файл был закодирован в формате utf-8, какой смысл пытаться использовать его с другими кодеками?
Означает ли "работает нормально с zcat", что вы получили распознаваемые данные без шага декодирования utf8 ??
Я предлагаю вам упростить код и выполнять его шаг за шагом ... см., Например, принятый ответ на этот вопрос . Попробуйте еще раз и, пожалуйста, покажите точный код, который вы запустили, и используйте repr () при описании результатов.
Обновление Похоже, DS догадался, что вы пытались объяснить относительно \ x1c и \ x1d.
Вот некоторые заметки о том, ПОЧЕМУ это происходит так:
В ASCII только \ r и \ n учитываются при переносе строки:
>>> import pprint
>>> text = ''.join('A' + chr(i) for i in range(32)) + 'BBB'
>>> print repr(text)
'A\x00A\x01A\x02A\x03A\x04A\x05A\x06A\x07A\x08A\tA\nA\x0bA\x0cA\rA\x0eA\x0fA\x10
A\x11A\x12A\x13A\x14A\x15A\x16A\x17A\x18A\x19A\x1aA\x1bA\x1cA\x1dA\x1eA\x1fBBB'
>>> pprint.pprint(text.splitlines(True))
['A\x00A\x01A\x02A\x03A\x04A\x05A\x06A\x07A\x08A\tA\n', # line break
'A\x0bA\x0cA\r', # line break
'A\x0eA\x0fA\x10A\x11A\x12A\x13A\x14A\x15A\x16A\x17A\x18A\x19A\x1aA\x1bA\x1cA\x
1dA\x1eA\x1fBBB']
>>>
Однако в Юникоде символы \ x1D (РАЗДЕЛИТЕЛЬ ФАЙЛА), \ x1E (РАЗДЕЛИТЕЛЬ ГРУППЫ) и \ x1E (РАЗДЕЛИТЕЛЬ ЗАПИСИ) также квалифицируются как окончания строк:
>>> text = u''.join('A' + unichr(i) for i in range(32)) + u'BBB'
>>> print repr(text)
u'A\x00A\x01A\x02A\x03A\x04A\x05A\x06A\x07A\x08A\tA\nA\x0bA\x0cA\rA\x0eA\x0fA\x10A\x11A\x12A\x13A\x14A\x15A\x16A\x17A\x18A\x19A\x1aA\x1bA\x1cA\x1dA\x1eA\x1fBBB'
>>> pprint.pprint(text.splitlines(True))
[u'A\x00A\x01A\x02A\x03A\x04A\x05A\x06A\x07A\x08A\tA\n', # line break
u'A\x0bA\x0cA\r', # line break
u'A\x0eA\x0fA\x10A\x11A\x12A\x13A\x14A\x15A\x16A\x17A\x18A\x19A\x1aA\x1bA\x1c', # line break
u'A\x1d', # line break
u'A\x1e', # line break
u'A\x1fBBB']
>>>
Это произойдет независимо от того, какой кодек вы используете. Вам все еще нужно решить, какой (если есть) кодек нужно использовать. Вам также необходимо выяснить, действительно ли исходный файл был текстовым, а не двоичным. Если это текстовый файл, вам необходимо учитывать значение \ x1c и \ x1d в этом файле.