[英]Reading a (presumably) unicode file in python
当我使用简单的I / o调用读取系统上的特定文件时,例如:
f = open('file.ini')
for line in f.readlines():
print line
我得到这样的输出:
H E L L O ! W H Y A R E T H E R E S O M A N Y S P A C E S ?
我认为它是Unicode,但我不太清楚如何将其读取为Unicode /将其转换为ascii。 建议?
尝试使用codecs
打开文件,使事情变得更容易。
例:
import codecs
f = codecs.open('file.ini', encoding='utf-16-le') # You can experiment with different encodings
for line in f: # note, the readlines is not really needed
print line, # the comma strips the trailing newline in case that's bothering you
PS:如果您不知道编码,我建议您看一下这个问题: 确定Python中文本的编码
垂直规则空间通常指示您的数据已以UTF16编码-通常您会看到的是第二个字节为0字节。 您可以通过打印出正在读取的实际二进制数据来确认这一点:
f = open('file.ini')
line in f.readline():
print map(ord, line)
如果您看到这样的输出:
[..., 68, 0, 65, 0, 76, 0, 76, 0, 79, ...]
那就几乎可以肯定了。
然后,诀窍是弄清是偶数字节为0还是奇数字节。 有两种UTF-16编码:大字节序和小字节序,以第一个字节的重要性命名。 如果您的0 早于与其关联的字符,则该文件为big-endian,您可以按以下方式打开它(Python 3.x):
f = open('file.ini', encoding='utf16be')
在Python 2.x中,导入codecs
模块以执行以下操作:
import codecs
f = codecs.open('file.ini', encoding='utf16be')
如果后面跟有0,则归类为'utf16le'。
(您需要确保在读取文件时对文件进行解码,或者在解码之前将整个内容读入内存。您绝对不想在解码之前将行分开)
如果幸运的话,该文件的开头是字节顺序标记,此字符为U + FEFF-如果前两个字节为[254, 255]
254,255 [254, 255]
,则编码为big-endian,如果[255, 254]
,那么它就是小端。
如果这些都不适用,那么您可能就不会查看UTF-16数据,并且您将不得不做更多的研究来弄清楚您正在寻找的编码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.