Python - Python 3.1似乎无法处理UTF-16编码的文件?

1 投票
2 回答
5119 浏览
提问于 2025-04-16 15:37

我正在尝试运行一些代码,目的是遍历一堆文件,把那些是 .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 行,解码时出错 (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf8' 编码无法解码位置 0 的字节 0xfe: 意外的代码字节

结果发现这些 .txt 文件都是用 UTF-16 编码的(至少根据 Firefox 的说法是这样)。我以为 Python 3.x 应该能处理任何类型的字符编码呢??

祝好,

乔治娜

2 个回答

6

有几种不同的utf-16编码方式。

  • utf-16-be 是大端编码,没有字节顺序标记(BOM)

  • utf-16-le 是小端编码,没有字节顺序标记(BOM)

  • utf-16 是小端编码,并且有字节顺序标记(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的回答中提到的方法使用这些编码。

8

使用 open(bla, 'r', encoding="utf-16") 这个方式来打开文件。

撰写回答