Python - Python 3.1 не может обрабатывать файлы в кодировке UTF-16? - PullRequest
1 голос
/ 13 апреля 2011

Я пытаюсь запустить некоторый код, чтобы просто просмотреть кучу файлов и записать те, которые оказались файлами .txt, в один файл, удалив все пробелы. Вот некоторый простой код, который должен добиться цели:

for subdir, dirs, files in os.walk(rootdir):
for file in files:
    if '.txt' in file:
        f = open(subdir+'/'+file, 'r')
        line = f.readline()
        while line:
            line2 = line.split()
            if line2:
                output_file.write(" ".join(line2)+'\n')
            line = f.readline()
        f.close()

Но вместо этого я получаю следующую ошибку:

Файл "/usr/lib/python3.1/codecs.py", строка 300, в декодировании (результат, использованный) = self._buffer_decode (data, self.errors, final) UnicodeDecodeError: кодек «utf8» не может декодировать байт 0xfe в позиции 0: неожиданный байт кода

Оказывается, что все эти файлы .txt находятся в UTF-16 (по крайней мере, согласно FireFox). Я думал, что Python 3.x должен был обрабатывать любые типы символов ??

Лучший, Джорджина

Ответы [ 2 ]

7 голосов
/ 13 апреля 2011

Использование open(bla, 'r', encoding="utf-16").

4 голосов
/ 13 апреля 2011

Существуют различные кодировки utf-16.

  • utf-16-be big endian без спецификации

  • utf-16-le little endian без спецификации

  • utf-16 little endian + BOM

Примеры:

Python 3.2 (r32:88452, Feb 20 2011, 11:12:31) 
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 'a'.encode('utf-16')
>>> a
b'\xff\xfea\x00'
>>> a.decode('utf-16')
'a'
>>> a = 'a'.encode('utf-16-le')
>>> a
b'a\x00'
>>> a.decode('utf-16-le')
'a'
>>> a = 'a'.encode('utf-16-be')
>>> a
b'\x00a'
>>> a.decode('utf-16-be')
'a'

Вы можете использовать эти кодировки в соответствии с предложением @ filmor's answer

...