2010-09-29 69 views
4

我知道我可以做到以下几点:如何以编程方式查找Python已知的编解码器列表?

>>> import encodings, pprint 
>>> pprint.pprint(sorted(encodings.aliases.aliases.values())) 
['ascii', 
'base64_codec', 
'big5', 
'big5hkscs', 
'bz2_codec', 
'cp037', 
'cp1026', 
'cp1140', 
'cp1250', 
'cp1251', 
'cp1252', 
'cp1253', 
'cp1254', 
'cp1255', 
'cp1256', 
'cp1257', 
'cp1258', 
'cp424', 
'cp437', 
'cp500', 
'cp775', 
'cp850', 
'cp852', 
'cp855', 
'cp857', 
'cp860', 
'cp861', 
'cp862', 
'cp863', 
'cp864', 
'cp865', 
'cp866', 
'cp869', 
'cp932', 
'cp949', 
'cp950', 
'euc_jis_2004', 
'euc_jisx0213', 
'euc_jp', 
'euc_kr', 
'gb18030', 
'gb2312', 
'gbk', 
'hex_codec', 
'hp_roman8', 
'hz', 
'iso2022_jp', 
'iso2022_jp_1', 
'iso2022_jp_2', 
'iso2022_jp_2004', 
'iso2022_jp_3', 
'iso2022_jp_ext', 
'iso2022_kr', 
'iso8859_10', 
'iso8859_11', 
'iso8859_13', 
'iso8859_14', 
'iso8859_15', 
'iso8859_16', 
'iso8859_2', 
'iso8859_3', 
'iso8859_4', 
'iso8859_5', 
'iso8859_6', 
'iso8859_7', 
'iso8859_8', 
'iso8859_9', 
'johab', 
'koi8_r', 
'latin_1', 
'mac_cyrillic', 
'mac_greek', 
'mac_iceland', 
'mac_latin2', 
'mac_roman', 
'mac_turkish', 
'mbcs', 
'ptcp154', 
'quopri_codec', 
'rot_13', 
'shift_jis', 
'shift_jis_2004', 
'shift_jisx0213', 
'tactis', 
'tis_620', 
'utf_16', 
'utf_16_be', 
'utf_16_le', 
'utf_32', 
'utf_32_be', 
'utf_32_le', 
'utf_7', 
'utf_8', 
'uu_codec', 
'zlib_codec'] 

我也肯定知道这是不是一个完整的列表,因为它包含为其别名存在编码(例如“cp737”缺失),并且至少有一些伪编码丢失(例如“string_escape”)。

正如问题的标题所示:如何以编程方式获取Python已知的所有编解码器/编码列表?

如果不是以编程方式:是否有在线可用的完整列表?

+0

可能重复:http://stackoverflow.com/questions/1728376/python-get-a-list-of-all-the-encodings-python-can-encode-to – 2010-09-29 18:14:12

回答

5

我不认为整个列表存储在python标准库的任何地方。相反,通过调用encoding.search_function(encoding)来按需加载编码。如果你在那里学习代码,它看起来像encoding字符串是第一次规范化,然后encodings包被搜索的子模块的名称匹配encoding

以下内容使用pkgutil列出所有子模块encoding,然后将它们添加到encoding.aliases.aliases中列出的子模块中。

不幸的是,encoding.aliases.aliases包含一个编码,tactis,这是不是由上述生成的,所以我试图通过联合两组产生完整的列表。

import encodings 
import os 
import pkgutil 

modnames=set([modname for importer, modname, ispkg in pkgutil.walk_packages(
    path=[os.path.dirname(encodings.__file__)], prefix='')]) 
aliases=set(encodings.aliases.aliases.values()) 

print(modnames-aliases) 
# set(['charmap', 'unicode_escape', 'cp1006', 'unicode_internal', 'punycode', 'string_escape', 'aliases', 'palmos', 'mac_centeuro', 'mac_farsi', 'mac_romanian', 'cp856', 'raw_unicode_escape', 'mac_croatian', 'utf_8_sig', 'mac_arabic', 'undefined', 'cp737', 'idna', 'koi8_u', 'cp875', 'cp874', 'iso8859_1']) 

print(aliases-modnames) 
# set(['tactis']) 

codec_names=modnames.union(aliases) 
print(codec_names) 
# set(['bz2_codec', 'cp1140', 'euc_jp', 'cp932', 'punycode', 'euc_jisx0213', 'aliases', 'hex_codec', 'cp500', 'uu_codec', 'big5hkscs', 'mac_romanian', 'mbcs', 'euc_jis_2004', 'iso2022_jp_3', 'iso2022_jp_2', 'iso2022_jp_1', 'gbk', 'iso2022_jp_2004', 'unicode_internal', 'utf_16_be', 'quopri_codec', 'cp424', 'iso2022_jp', 'mac_iceland', 'raw_unicode_escape', 'hp_roman8', 'iso2022_kr', 'cp875', 'iso8859_6', 'cp1254', 'utf_32_be', 'gb2312', 'cp850', 'shift_jis', 'cp852', 'cp855', 'iso8859_3', 'cp857', 'cp856', 'cp775', 'unicode_escape', 'cp1026', 'mac_latin2', 'utf_32', 'mac_cyrillic', 'base64_codec', 'ptcp154', 'palmos', 'mac_centeuro', 'euc_kr', 'hz', 'utf_8', 'utf_32_le', 'mac_greek', 'utf_7', 'mac_turkish', 'utf_8_sig', 'mac_arabic', 'tactis', 'cp949', 'zlib_codec', 'big5', 'iso8859_9', 'iso8859_8', 'iso8859_5', 'iso8859_4', 'iso8859_7', 'cp874', 'iso8859_1', 'utf_16_le', 'iso8859_2', 'charmap', 'gb18030', 'cp1006', 'shift_jis_2004', 'mac_roman', 'ascii', 'string_escape', 'iso8859_15', 'iso8859_14', 'tis_620', 'iso8859_16', 'iso8859_11', 'iso8859_10', 'iso8859_13', 'cp950', 'utf_16', 'cp869', 'mac_farsi', 'rot_13', 'cp860', 'cp861', 'cp862', 'cp863', 'cp864', 'cp865', 'cp866', 'shift_jisx0213', 'johab', 'mac_croatian', 'cp1255', 'latin_1', 'cp1257', 'cp1256', 'cp1251', 'cp1250', 'cp1253', 'cp1252', 'cp437', 'cp1258', 'undefined', 'cp737', 'koi8_r', 'cp037', 'koi8_u', 'iso2022_jp_ext', 'idna']) 
+1

@killown:你downvote这?如果是的话,你不应该,因为它提供了一个编程有用的结果(一组),这是我的主要目标。我如何迭代程序中的'help(encodings)'? – tzot 2010-09-29 18:20:50

+0

一般来说:凡是低估了这个答案的人都完全没有理解这里的up/downvoting意味着什么,并且应该在点击之前将鼠标指针悬停在箭头上方。 – tzot 2010-09-29 18:24:45

+0

@ killown:确实;看谁投票结束这个问题。不幸的是,问题发布后类似问题的列表* *在输入问题期间与*不一样*此外,使用“[python]编码列表”进行的搜索没有获得旧的问题。 – tzot 2010-09-29 18:35:58

相关问题