【问题标题】:"io.open" is improperly opening UTF-16 files“io.open”不正确地打开 UTF-16 文件
【发布时间】:2014-10-17 20:06:36
【问题描述】:

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 确定)抽象出需要如果在第一行的开头遇到,我可以跳过一堆硬编码的前导码。

【问题讨论】:

  • "io.open 应该在以各种编码打开文件时剥离前导码。" - 是什么让您相信这一点?我在文档中找不到任何声明来支持这一点。

标签: python file python-2.7 encoding io


【解决方案1】:

根据this answer,你需要使用UTF-16,而不是UTF-16LE

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

【讨论】:

  • 嗯,这对我来说是个问题,因为我什至不看编码。我只是把chardet 吐出的任何东西都拿走,然后用它来解码文件。 Chardet 吐出UTF-16LE(和UTF-16BE 表示另一个同样失败的)
  • 但是,这很好。我刚刚添加了if 'UTF-16' in detected: detected = 'UTF-16' 并解决了这两种情况,所以我不介意把那个肮脏的小黑客扔在那里。谢谢!
猜你喜欢
  • 2013-04-30
  • 1970-01-01
  • 2017-06-27
  • 2012-04-12
  • 2013-01-12
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
相关资源
最近更新 更多