python open ansi_如何读取在python中可以保存为ansi或unicode的文件?

MS Notepad为用户提供了4种编码选择,用令人费解的术语表示:

“Unicode”是UTF-16,写的是小尾数Unicode big endian”是UTF-16,写的是big endian。在两种UTF-16情况下,这意味着将编写适当的BOM。使用utf-16解码这样的文件。

“UTF-8”是UTF-8;记事本显式地写入“UTF-8bom”。使用utf-8-sig解码这样的文件。

“ANSI”是一个令人震惊的词。这是MS术语中的“此计算机上的默认遗留编码是什么”。

以下是我知道的Windows编码列表以及它们用于的语言/脚本:cp874 Thai

cp932 Japanese

cp936 Unified Chinese (P.R. China, Singapore)

cp949 Korean

cp950 Traditional Chinese (Taiwan, Hong Kong, Macao(?))

cp1250 Central and Eastern Europe

cp1251 Cyrillic ( Belarusian, Bulgarian, Macedonian, Russian, Serbian, Ukrainian)

cp1252 Western European languages

cp1253 Greek

cp1254 Turkish

cp1255 Hebrew

cp1256 Arabic script

cp1257 Baltic languages

cp1258 Vietnamese

cp???? languages/scripts of India

如果文件是在读取它的计算机上创建的,那么可以通过locale.getpreferredencoding()获得“ANSI”编码。否则,如果您知道它来自何处,则可以指定如果它不是UTF-16,则使用何种编码。不及格,猜猜看。

小心使用codecs.open()读取Windows上的文件。医生说:“注意”

文件总是以二进制模式打开,即使没有指定二进制模式。这样做是为了避免由于使用8位值编码而导致的数据丢失。这意味着在读和写时不会自动转换“\n”。“”这意味着您的行将以\r\n结尾,您需要/想要删除这些行。

总而言之:

示例文本文件与所有4种编码选项一起保存在记事本中,如下所示:The quick brown fox jumped over the lazy dogs.

àáâãäå

下面是一些演示代码:import locale

def guess_notepad_encoding(filepath, default_ansi_encoding=None):

with open(filepath, 'rb') as f:

data = f.read(3)

if data[:2] in ('\xff\xfe', '\xfe\xff'):

return 'utf-16'

if data == u''.encode('utf-8-sig'):

return 'utf-8-sig'

# presumably "ANSI"

return default_ansi_encoding or locale.getpreferredencoding()

if __name__ == "__main__":

import sys, glob, codecs

defenc = sys.argv[1]

for fpath in glob.glob(sys.argv[2]):

print

print (fpath, defenc)

with open(fpath, 'rb') as f:

print "raw:", repr(f.read())

enc = guess_notepad_encoding(fpath, defenc)

print "guessed encoding:", enc

with codecs.open(fpath, 'r', enc) as f:

for lino, line in enumerate(f, 1):

print lino, repr(line)

print lino, repr(line.rstrip('\r\n'))

下面是在Windows“Command Prompt”窗口中使用命令\python27\python read_notepad.py "" t1-*.txt运行时的输出('t1-ansi.txt', '')

raw: 'The quick brown fox jumped over the lazy dogs.\r\n\xe0\xe1\xe2\xe3\xe4\xe5

\r\n'

guessed encoding: cp1252

1 u'The quick brown fox jumped over the lazy dogs.\r\n'

1 u'The quick brown fox jumped over the lazy dogs.'

2 u'\xe0\xe1\xe2\xe3\xe4\xe5\r\n'

2 u'\xe0\xe1\xe2\xe3\xe4\xe5'

('t1-u8.txt', '')

raw: '\xef\xbb\xbfThe quick brown fox jumped over the lazy dogs.\r\n\xc3\xa0\xc3

\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\r\n'

guessed encoding: utf-8-sig

1 u'The quick brown fox jumped over the lazy dogs.\r\n'

1 u'The quick brown fox jumped over the lazy dogs.'

2 u'\xe0\xe1\xe2\xe3\xe4\xe5\r\n'

2 u'\xe0\xe1\xe2\xe3\xe4\xe5'

('t1-uc.txt', '')

raw: '\xff\xfeT\x00h\x00e\x00 \x00q\x00u\x00i\x00c\x00k\x00 \x00b\x00r\x00o\x00w

\x00n\x00 \x00f\x00o\x00x\x00 \x00j\x00u\x00m\x00p\x00e\x00d\x00 \x00o\x00v\x00e

\x00r\x00 \x00t\x00h\x00e\x00 \x00l\x00a\x00z\x00y\x00 \x00d\x00o\x00g\x00s\x00.

\x00\r\x00\n\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\r\x00\n\x00'

guessed encoding: utf-16

1 u'The quick brown fox jumped over the lazy dogs.\r\n'

1 u'The quick brown fox jumped over the lazy dogs.'

2 u'\xe0\xe1\xe2\xe3\xe4\xe5\r\n'

2 u'\xe0\xe1\xe2\xe3\xe4\xe5'

('t1-ucb.txt', '')

raw: '\xfe\xff\x00T\x00h\x00e\x00 \x00q\x00u\x00i\x00c\x00k\x00 \x00b\x00r\x00o\

x00w\x00n\x00 \x00f\x00o\x00x\x00 \x00j\x00u\x00m\x00p\x00e\x00d\x00 \x00o\x00v\

x00e\x00r\x00 \x00t\x00h\x00e\x00 \x00l\x00a\x00z\x00y\x00 \x00d\x00o\x00g\x00s\

x00.\x00\r\x00\n\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\r\x00\n'

guessed encoding: utf-16

1 u'The quick brown fox jumped over the lazy dogs.\r\n'

1 u'The quick brown fox jumped over the lazy dogs.'

2 u'\xe0\xe1\xe2\xe3\xe4\xe5\r\n'

2 u'\xe0\xe1\xe2\xe3\xe4\xe5'

注意事项:

(1)“mbcs”是一种文件系统伪编码,与解码文件的内容完全无关。在一个默认编码为cp1252的系统上,它生成类似latin1(aarrgghh!!);见下文>>> all_bytes = "".join(map(chr, range(256)))

>>> u1 = all_bytes.decode('cp1252', 'replace')

>>> u2 = all_bytes.decode('mbcs', 'replace')

>>> u1 == u2

False

>>> [(i, u1[i], u2[i]) for i in xrange(256) if u1[i] != u2[i]]

[(129, u'\ufffd', u'\x81'), (141, u'\ufffd', u'\x8d'), (143, u'\ufffd', u'\x8f')

, (144, u'\ufffd', u'\x90'), (157, u'\ufffd', u'\x9d')]

>>>

(2)chardet非常擅长检测基于非拉丁语脚本的编码(中文/日语/朝鲜语、西里尔语、希伯来语、希腊语),但不太擅长基于拉丁语的编码(西欧/中欧/东欧、土耳其语、越南语),根本不懂阿拉伯语。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值