"Пробелы", которые вы видите, выглядят как NUL ("\ x00").Вероятность того, что ваш файл закодирован в UTF-16, UTF-16LE или UTF-16BE, составляет 99,9%.Если это одноразовый файл, просто откройте его с помощью Блокнота и сохраните как «ANSI», а не «Unicode» и не «Unicode bigendian».Однако, если вам нужно обработать его как есть, вам нужно знать / определить, что такое кодировка.Чтобы выяснить, что, сделайте следующее:
print repr(open("yourfile.txt", "rb").read(20))
и сравните исходную информацию со следующим:
>>> ucode = u"70154:"
>>> for sfx in ["", "LE", "BE"]:
... enc = "UTF-16" + sfx
... print enc, repr(ucode.encode(enc))
...
UTF-16 '\xff\xfe7\x000\x001\x005\x004\x00:\x00'
UTF-16LE '7\x000\x001\x005\x004\x00:\x00'
UTF-16BE '\x007\x000\x001\x005\x004\x00:'
>>>
Вы можете сделать детектор, который достаточно хорош для ваших целей, проверяяпервые 2 байта:
[pseudocode]
if f2b in `"\xff\xfe\xff"`: UTF-16
elif f2b[1] == `"\x00"`: UTF-16LE
elif f2b[0] == `"\x00"`: UTF-16BE
else: cp1252 or UTF-8 or whatever else is prevalent in your neck of the woods.
Вы можете избежать жесткого кодирования резервной кодировки:
>>> import locale
>>> locale.getpreferredencoding()
'cp1252'
Ваш код чтения строки будет выглядеть следующим образом:
rawbytes = open(myFile, "rb").read()
enc = detect_encoding(rawbytes[:2])
for line in rawbytes.decode(enc).splitlines():
# whatever
О, и линии будут unicode
объектами ... если это вызывает у вас проблемы, задайте еще один вопрос.