Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >为什么打印到utf-8文件失败?

为什么打印到utf-8文件失败?
EN

Stack Overflow用户
提问于 2011-06-29 13:22:42
回答 3查看 3.2K关注 0票数 2

所以今天下午我遇到了一个问题,我能够解决它,但我不太明白为什么它会起作用。

这与我前几周遇到的一个问题有关:python check if utf-8 string is uppercase

基本上,以下内容将行不通:

代码语言:javascript
代码运行次数:0
复制
#!/usr/bin/python

import codecs
from lxml import etree

outFile = codecs.open('test.xml', 'w', 'utf-8') #cannot use codecs.open()

root = etree.Element('root')
sect = etree.SubElement(root,'sect')


words = (   u'\u041c\u041e\u0421\u041a\u0412\u0410', # capital of Russia, all uppercase
            u'R\xc9SUM\xc9',    # RESUME with accents
            u'R\xe9sum\xe9',    # Resume with accents
            u'R\xe9SUM\xe9', )  # ReSUMe with accents

for word in words:
    print word
    if word.encode('utf8').decode('utf8').isupper(): #.isupper won't function on utf8 
        title = etree.SubElement(sect,'title')
        title.text = word
    else:
       item = etree.SubElement(sect,'item')
       item.text = word 

print>>outFile,etree.tostring(root,pretty_print=True,xml_declaration=True,encoding='utf-8')

它失败的原因如下:

跟踪(最近一次调用):

文件“/tem.py”,第25行,在

打印>>outFile,etree.tostring(根,pretty_print=True,xml_declaration=True,编码=‘utf-8’)

文件"/usr/lib/python2.7/codecs.py",

第691行,写

返回self.writer.write(数据) File "/usr/lib/python2.7/codecs.py",

第351行,书写

data,data= self.encode(object,self.errors)

UnicodeDecodeError: ascii编解码器

无法解码位置66的字节0xd0:

序数不在(128) 范围内

但是,如果我在没有codecs.open('test.xml', 'w', 'utf-8')的情况下打开新文件,而是使用outFile = open('test.xml', 'w'),那么它就能很好地工作。

,发生什么事了??

  • ,因为encoding='utf-8'是在etree.tostring()中指定的,它是否再次编码该文件?如果离开codecs.open()并删除encoding='utf-8',则该文件将成为ascii文件。为什么?因为etree.tostring()的默认编码是ascii i
  • ,但是etree.tostring()只是简单地被写入stdout,然后重定向到作为utf-8文件??

创建的文件。

代码语言:javascript
代码运行次数:0
复制
- is `print>>` not workings as I expect? `outFile.write(etree.tostring())` behaves the same way. 

基本上,为什么这不起作用?这是怎么回事。这可能是微不足道的,但我显然有点困惑,我想弄清楚为什么我的解决方案有效,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-29 14:21:08

您已经用UTF-8编码打开了该文件,这意味着它需要Unicode字符串。

tostring是编码到UTF-8 (以字节字符串的形式,str),您正在写入该文件。

因为文件需要Unicode,所以它使用默认的ASCII编码将字节字符串解码为Unicode,这样它就可以将Unicode编码到UTF-8。

不幸的是,字节字符串不是ASCII。

编辑:避免这种问题的最佳建议是在内部使用Unicode,对输入进行解码,对输出进行编码。

票数 3
EN

Stack Overflow用户

发布于 2011-06-29 16:28:01

使用print>>outFile有点奇怪。我没有安装lxml,但是内置的xml.etree库类似(但不支持pretty_print)。将root元素包装在一个ElementTree中,并使用写方法。

此外,如果使用# coding行声明源文件的编码,则可以使用可读的Unicode字符串而不是转义代码:

代码语言:javascript
代码运行次数:0
复制
#!/usr/bin/python
# coding: utf8

import codecs
from xml.etree import ElementTree as etree

root = etree.Element(u'root')
sect = etree.SubElement(root,u'sect')


words = [u'МОСКВА',u'RÉSUMÉ',u'Résumé',u'RéSUMé']

for word in words:
    print word
    if word.isupper():
        title = etree.SubElement(sect,u'title')
        title.text = word
    else:
       item = etree.SubElement(sect,u'item')
       item.text = word 

tree = etree.ElementTree(root)
tree.write('text.xml',xml_declaration=True,encoding='utf-8')
票数 1
EN

Stack Overflow用户

发布于 2012-05-04 10:32:34

除了MRAB之外,还回答了一些代码行:

代码语言:javascript
代码运行次数:0
复制
import codecs
from lxml import etree

root = etree.Element('root')
sect = etree.SubElement(root,'sect')

# do some other xml building here

with codecs.open('test.xml', 'w', encoding='utf-8') as f:
    f.write(etree.tostring(root, encoding=unicode))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6527420

复制
相关文章
fopen函数打开文件失败原因_为什么打开文件失败
大家好,我是疯狂的比特,一个每天在互联网上种菜和砍柴的程序员 今天给大家分享一个C语言初学者常见的一个问题。
全栈程序员站长
2022/11/04
4.6K0
python调用系统命令打印到文件里
python脚本调用ls命令,把信息打印到文件1.txt里面 #!/bin/env python3 import os def hell(): file = open('1.txt','w') #打开文件,有写,覆盖 llll=os.popen('ls -l').readlines() #调用系统命令,readlines 写到内存中 for i in llll: #做一个循环 file.wr
py3study
2020/01/08
9390
关于multiprocessing中的logging的数据打印到本地失败或重复问题
首先排除进程间重复导入logging包的问题 然后注意被多进程的类中哪些变量是真实意义上有被序列化 loging的level设置、handler设置在多进程继承的类中初始化会失效,因此需要在run前调
嘘、小点声
2021/07/08
9520
为什么 demangle 会失败?
本周有位网友在交流群提到“为什么无法在自己的电脑中通过 c++filt 解析符号 _ZN5folly6detail15str_to_integralIxEENS_8ExpectedIT_NS_14ConversionCodeEEEPNS_5RangeIPKcEE ?”
酷酷的哀殿
2020/10/26
1.2K0
为什么 demangle 会失败?
简评 WhereHows 为什么失败
DataHub 是由领英的数据团队开源的一款提供元数据搜索与发现的工具。现在的 DataHub 是由 WhereHows 演变过来的。
哒呵呵
2021/12/18
9180
简评 WhereHows 为什么失败
明明打印到文件了,为啥tail -f看不到
文章《一分钟了解nohup和&的功效》留了一个“nohup.out为啥没有包含stdout输出”的尾巴,今天把坑填了。
架构师之路
2018/07/27
7820
明明打印到文件了,为啥tail -f看不到
思科“打A办”的失败,成就今日之王者!
本文由华尔街日报发表于2017 年 8 月 17 日,故本文时间线均为2017年。Arista网站曾经刊登全文但是链接失效。
用户6874558
2023/02/28
6260
思科“打A办”的失败,成就今日之王者!
IDEA 工程文件 UTF-8 编码设置
?
一个会写诗的程序员
2019/04/18
2.6K0
IDEA 工程文件 UTF-8 编码设置
NextCloud删除文件失败
修改 config/config.php 配置文件,添加或修改 'maintenance' => true,
鹏程
2023/08/10
9410
NextCloud删除文件失败
为什么打二星那么难?
本文主要探讨了技术社区中编辑人员的工作职责和面临的挑战,包括技术背景的社区成员如何提高编辑能力、处理社区中的多元声音、保持社区活跃度、以及应对社区中出现的负面言论和冲突等内容。
王拥军
2017/05/08
3.2K1
为什么不建议在MySQL中使用UTF-8?
最近我遇到了一个bug,我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误:
Bug开发工程师
2019/05/15
8320
RethinkDB:​​为什么我们失败了
本文来自rethinkDB失败后的复盘,正是因为有点年代现在拿出来看更有意思,可以对复盘作个复盘,哪些分析和对未来(也就是今天)的判断不对,原文地址:https://www.defmacro.org/2017/01/18/why-rethinkdb-failed.html
sealyun
2022/05/17
1.4K0
RethinkDB:​​为什么我们失败了
UTF-8 为什么会比 UTF-16 浪费?
上帝说:『首先取下栓,然后不多不少数到三。应该数到三,你数到的数字是三。你除了数到三,既不要数到四,也不要数到二,五是数多了。「三」一旦被数到,成为被数到的第三个数字,就高高的向敌人扔出安提拉之神圣手
前端教程
2018/03/05
9950
UTF-8 为什么会比 UTF-16 浪费?
为什么不建议在MySQL中使用UTF-8?
作者:brightwang 原文:https://www.jianshu.com/p/ab9aa8d4df7d
好好学java
2019/10/10
8600
为什么不建议在 MySQL 中使用 UTF-8?
在往MySQL存入emoji表情😲😳时,一直出错,无法导入。后来找到办法 -- 通过把 utf8 改成 utf8mb4 就可以了,并没有深究. 嗯?他本身不就是utf8编码么!那我当时还改个锤子? 难道,MySQL的utf8不是真正的UTF-8编码吗??! 卧槽这。。MySQL有bug! 带着疑问查询了很多相关材料,才发现这竟然是MySQL的一个历史遗留问题~~ 我笑了,没想到这么牛B的MySQL也会有这段往事。 一、报错回顾 将emoji文字直接写入SQL中,执行 insert 语句报错; INSERT
码农编程进阶笔记
2021/12/01
7180
为什么不建议在 MySQL 中使用 UTF-8?
​为什么企业敏捷团队会失败
上周,我站在一家市值 200 亿美元的公司的会议室里,推动了一个关于敏捷的研讨会。出席会议的小组由这家大公司的一个产品线中的每个职能部门的董事和部门经理组成。从 UX、工程和产品管理的岗位中挑选出来的十几位领导者组成了一支团队,他们代表着约 150 人的产品线。作为一个团队,他们踏上了“敏捷”的旅程。
腾讯云 CODING
2019/08/20
6660
为什么机器学习模型会失败?
在机器学习中,当你建立和训练一个模型并检验其准确性时,一个最常见的问题就是“准确性是我能从数据中得到的最好的,还是能找到一个更好的模型呢?”
深度学习与Python
2021/12/09
5160
为什么机器学习模型会失败?
为什么博客运营会失败?
从目前来看,独立博客已经存在很多年,目前仍然有少量的站长在坚持写博客,但大部分的博客都是配置完域名和服务器之后,就被长时间的搁置,而没有任何商业价值。
蝙蝠侠IT
2021/09/27
8560
为什么RPA项目失败了呢?
要问2019年哪个领域最火,肯定少不了RPA。RPA是机器人流程自动化,可以模拟人与计算机的交互过程。简单点说,那些基于固定规则不断重复、标准化的工作,例如读取邮件、对账汇总、采集数据、制作报表等费时费力,让你不胜其烦的工作,都可以交给RPA来完成。
RPA小葵
2020/04/08
7450
为什么RPA项目失败了呢?
系统日报-20220502(RethinkDB 为什么失败?)
来源:https://www.defmacro.org/2017/01/18/why-rethinkdb-failed.html
木鸟杂记
2022/05/18
2720
系统日报-20220502(RethinkDB 为什么失败?)

相似问题

从List<string>创建List<CustomObject>

31

在列表视图中显示list<T>

23

如何在Javascript Metro应用程序中检测列表视图中项目的右键单击

20

在列表视图中显示项目

13

JavaFX计数ObservableList<CustomObject>中的项目

120
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文