将unicode转换为实际字符

时间:2015-03-15 22:21:58

标签: python unicode lxml codec

我正在用中文写一个文件:

<locale name="cmn-Hans">
    <title>&#22823;&#30333;&#40104; Jaws</title>
    <synopsis>&#30001;&#37329;&#20687;&#22870;&#23548;&#28436;&#21490;&#33922;&#33452;&#183;&#26031;&#30382;&#23572;&#20271;&#26684;&#25191;&#23548;&#65292;&#12298;&#22823;&#30333;&#40104;&#12299;&#26641;&#31435;&#20102;&#32039;&#24352;&#24748;&#30097;&#29255;&#30340;&#26631;&#20934;&#65292;&#24182;&#36805;&#36895;&#25104;&#20026;&#19968;&#31181;&#25991;&#21270;&#29616;&#35937;&#65292;&#27704;&#36828;&#25913;&#21464;&#20102;&#35266;&#20247;&#30340;&#30005;&#24433;&#32463;&#39564;&#12290;&#28626;&#28023;&#30340;&#33406;&#31859;&#25552;&#23567;&#38215;&#36973;&#21040;&#19968;&#26465;&#21361;&#38505;&#30340;&#22823;&#30333;&#40104;&#25915;&#20987;&#65292;&#38215;&#19978;&#30340;&#35686;&#38271;(&#27931;&#20234;&#183;&#34203;&#24503;)&#12289;&#24180;&#36731;&#30340;&#28023;&#27915;&#29983;&#29289;&#23398;&#23478;(&#29702;&#26597;&#24503;&#183;&#29790;&#20315;&#26031;)&#12289;&#32769;&#25104;&#30340;&#40104;&#40060;&#29454;&#20154;(&#32599;&#20271;&#29305;&#183;&#33831;)&#32852;&#25163;&#23637;&#24320;&#19968;&#22330;&#21361;&#24613;&#30340;&#20882;&#38505;&#65292;&#20934;&#22791;&#27585;&#28781;&#36825;&#21482;&#24618;&#20861;&#65292;&#20813;&#24471;&#23427;&#20877;&#24230;&#20260;&#20154;&#12290;&#20196;&#20154;&#38590;&#24536;&#30340;&#37197;&#20048;&#24102;&#26469;&#32431;&#31929;&#30340;&#24656;&#24807;&#65292;&#12298;&#22823;&#30333;&#40104;&#12299;&#33267;&#20170;&#20173;&#26159;&#30005;&#24433;&#21490;&#19978;&#26368;&#20855;&#24433;&#21709;&#21147;&#12289;&#26368;&#25187;&#20154;&#24515;&#24358;&#30340;&#20882;&#38505;&#30005;&#24433;&#20043;&#19968;&#12290;</synopsis>
</locale>

该文件使用codecs编写,如下所示:

new_file = codecs.open(metadata_filepath, 'w', 'utf8')
new_file.write(u'''contents here''')

如何让文件看起来像实际中文字符而不是unicode字符:

<locale name="cmn-Hans">
    <title>大白鲨 Jaws</title>
    <synopsis>由金像奖导演史蒂芬·斯皮尔伯格执导,《大白鲨》树立了紧张悬疑片的标准,并迅速成为一种文化现象,永远改变了观众的电影经验。濒海的艾米提小镇遭到一条危险的大白鲨攻击,镇上的警长(洛伊·薛德)、年轻的海洋生物学家(理查德·瑞佛斯)、老成的鲨鱼猎人(罗伯特·萧)联手展开一场危急的冒险,准备毁灭这只怪兽,免得它再度伤人。令人难忘的配乐带来纯粹的恐惧,《大白鲨》至今仍是电影史上最具影响力、最扣人心弦的冒险电影之一。</synopsis>
</locale>

如何让文件打印中文字符(至今仍)而不是Unicode表示(490;&amp;#19978)?

要获取初始内容,我使用的是中文xml文件中的etree.tostring(...)

1 个答案:

答案 0 :(得分:2)

在Python 2中,将encoding="utf-8"传递给ElementTree.tostring,然后以二进制模式打开文件。在Python 3中,您可以将encoding="unicode"传递给ElementTree.tostring,然后按原样打开文件。

演示(Python 2):

>>> print(ET.tostring(tree, encoding="utf-8"))
<locale name="cmn-Hans">
    <title>大白鲨 Jaws</title>
    <synopsis>由金像奖导演史蒂芬·斯皮尔伯格执导,《大白鲨》树立了紧张悬疑片的标准,并迅速成为一种文化现象,永远改变了观众的电影经验。濒海的艾米提小镇遭到一条危险的大白鲨攻击,镇上的警长(洛伊·薛德)、年轻的海洋生物学家(理查德·瑞佛斯)、老成的鲨鱼猎人(罗伯特·萧)联手展开一场危急的冒险,准备毁灭这只怪兽,免得它再度伤人。令人难忘的配乐带来纯粹的恐惧,《大白鲨》至今仍是电影史上最具影响力、最扣人心弦的冒险电影之一。</synopsis>
</locale>

>>> print(ET.tostring(tree))
<locale name="cmn-Hans">
    <title>&#22823;&#30333;&#40104; Jaws</title>
<synopsis>&#30001;&#37329;&#20687;&#22870;&#23548;&#28436;&#21490;&#33922;&#33452;&#183;&#26031;&#30382;&#23572;&#20271;&#26684;&#25191;&#23548;&#65292;&#12298;&#22823;&#30333;&#40104;&#12299;&#26641;&#31435;&#20102;&#32039;&#24352;&#24748;&#30097;&#29255;&#30340;&#26631;&#20934;&#65292;&#24182;&#36805;&#36895;&#25104;&#20026;&#19968;&#31181;&#25991;&#21270;&#29616;&#35937;&#65292;&#27704;&#36828;&#25913;&#21464;&#20102;&#35266;&#20247;&#30340;&#30005;&#24433;&#32463;&#39564;&#12290;&#28626;&#28023;&#30340;&#33406;&#31859;&#25552;&#23567;&#38215;&#36973;&#21040;&#19968;&#26465;&#21361;&#38505;&#30340;&#22823;&#30333;&#40104;&#25915;&#20987;&#65292;&#38215;&#19978;&#30340;&#35686;&#38271;(&#27931;&#20234;&#183;&#34203;&#24503;)&#12289;&#24180;&#36731;&#30340;&#28023;&#27915;&#29983;&#29289;&#23398;&#23478;(&#29702;&#26597;&#24503;&#183;&#29790;&#20315;&#26031;)&#12289;&#32769;&#25104;&#30340;&#40104;&#40060;&#29454;&#20154;(&#32599;&#20271;&#29305;&#183;&#33831;)&#32852;&#25163;&#23637;&#24320;&#19968;&#22330;&#21361;&#24613;&#30340;&#20882;&#38505;&#65292;&#20934;&#22791;&#27585;&#28781;&#36825;&#21482;&#24618;&#20861;&#65292;&#20813;&#24471;&#23427;&#20877;&#24230;&#20260;&#20154;&#12290;&#20196;&#20154;&#38590;&#24536;&#30340;&#37197;&#20048;&#24102;&#26469;&#32431;&#31929;&#30340;&#24656;&#24807;&#65292;&#12298;&#22823;&#30333;&#40104;&#12299;&#33267;&#20170;&#20173;&#26159;&#30005;&#24433;&#21490;&#19978;&#26368;&#20855;&#24433;&#21709;&#21147;&#12289;&#26368;&#25187;&#20154;&#24515;&#24358;&#30340;&#20882;&#38505;&#30005;&#24433;&#20043;&#19968;&#12290;</synopsis>
</locale>