io.open" 错误打开 UTF-16 文件

0 投票
1 回答
599 浏览
提问于 2025-04-28 04:42

io.open 本来应该在打开不同编码的文件时,自动去掉一些开头的多余部分。

比如,下面这个用 UTF-8-SIG 编码的文件,在读取成字符串之前,它的开头部分就被正确去掉了:

(注意:我并不是以二进制模式打开这些文件。日志的第一行是为了展示即将读取的文件内容。)

# Raw binary, so you can see that it's a proper UTF-8-SIG encoded file
import io; io.open(csv_file_path, 'br').readline()
'\xef\xbb\xbf"EventId","Rate","Attribute1","Attribute2","(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89"\r\n'

# Open file with encoding specified
import io; io.open(csv_file_path, encoding='UTF-8-SIG').readline()
u'"EventId","Rate","Attribute1","Attribute2","(\uff61\uff65\u03c9\uff65\uff61)\uff89"\n'

但是,当我打开一个用 UTF-16LE 编码的文件时,虽然文件成功打开,但开头的多余部分却没有被去掉:

# Raw binary, so you can see that it's a proper UTF-16LE encoded file
import io; io.open(csv_file_path, 'br').readline()
'\xff\xfe"\x00E\x00v\x00e\x00n\x00t\x00I\x00d\x00"\x00,\x00"\x00R\x00a\x00t\x00e\x00"\x00,\x00"\x00A\x00t\x00t\x00r\x00i\x00b\x00u\x00t\x00e\x001\x00"\x00,\x00"\x00A\x00t\x00t\x00r\x00i\x00b\x00u\x00t\x00e\x002\x00"\x00,\x00"\x00(\x00a\xffe\xff\xc9\x03e\xffa\xff)\x00\x89\xff"\x00\r\x00\n'

# Open file with encoding specified
import io; io.open(csv_file_path, encoding='UTF-16LE').readline()
u'\ufeff"EventId","Rate","Attribute1","Attribute2","(\uff61\uff65\u03c9\uff65\uff61)\uff89"\n'

这导致文件验证出现问题,因为它期望文件内容一开始就应该是 "EventId"...

我是不是打开这个文件的方式不对?

我并不想在打开文件后还手动去掉开头的多余部分——我希望能够支持各种编码,并且期待 io.open(在提供了正确编码的情况下,按照 chardet 的判断)能够自动处理这些开头的多余部分,而不需要我自己硬编码去跳过它们。

暂无标签

1 个回答

2

根据这个回答,你需要使用UTF-16,而不是UTF-16LE

io.open(csv_file_path, encoding='UTF-16').readline()

撰写回答