Я спросил (в комментарии) """Покажите нам вывод из 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']
>>>
Однако в Unicode символы \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 в файле.
person
John Machin
schedule
30.04.2010
xxd
(или с помощью vim вы можете использовать ctrl-a, чтобы найти шестнадцатеричный код символа) - person Daniel DiPaolo   schedule 29.04.2010print repr(weird_special_characters)
. Когда вы открываете файл в vim, ЧТО правильно? Пожалуйста, будьте более точны, чем странно отформатированы. - person John Machin   schedule 29.04.2010