繁体   English   中英

在python中读取一个(大概)unicode文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM