跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Python xml 模块的一个坑
未分類
2 9 月 2020

Python xml 模块的一个坑

Python xml 模块的一个坑

資深大佬 : Leon6868 19

这个坑出在文件编码上。
当你使用 doc.writexml(f, encoding="utf-8") 时,这里的 encoding 只会在 xml 标签上添加encoding="utf-8"标签,而 xml 文件内容本身的编码,是没有改变的。
这就意味着,如果你写入中文,无论你怎么 encode 、decode,最终只会得到一个充满乱码的 xml 文件。
正确的写法是这样:

with open(file, "w", encoding="utf-8") as f:     doc.writexml(file, encoding="utf-8") 

在 open 方法里面加入 encoding=”utf-8″,才会改变文件的编码。

这个坑还没有人专门写,所以记录一下,希望能帮到一些人。

大佬有話說 (9)

  • 資深大佬 : learningman

    说明看文档要仔细

  • 資深大佬 : Jirajine

    Python 的这个编码问题一直都很坑,别的大多数语言字符串都是 utf-8 encoded bytes,唯独 Python 的字符串是未编码的,而且编码时默认还是平台的编码而不是一律 utf-8 。

  • 資深大佬 : Nitroethane

    这怕是你没仔细看文档吧,文档里清楚地写了 “For the Document node, an additional keyword argument encoding can be used to specify the encoding field of the XML header.”,人可没说是指定文件内容的编码

  • 資深大佬 : abersheeran

    我个人觉得是你不懂 open 这个内置函数以及文件编码导致的。

  • 資深大佬 : abersheeran

    @Jirajine 兄弟,这都 2020 年了,你还在这念 Python2 的经?

  • 資深大佬 : fhsan

    都什么年代了,还分不清编码问题,python 获取当前操作系统编码,如果你想保持一致,write 、open 文本文件都要指定编码。统一编码是不可能的

  • 資深大佬 : Jirajine

    @abersheeran 说的就是 Python3 啊,别的语言 string 可以直接当成 utf-8 encoded bytes 用,唯独 Python 需要额外把 string encode 成 bytes,并且默认参数在 Windows 下还不是 utf-8 。
    至于内部如何表示那是另一回事了,string 暴露出来的接口就是未编码的字符串对象,需要调用 encode()才会变成 bytes 。

  • 資深大佬 : abersheeran

    @Jirajine 你说的别的语言怕是 C 这种弱类型吧。哪个强类型语言还能把 string 当 bytes 用的?你举个例子。

  • 資深大佬 : Jirajine

    @abersheeran golong 、rust 都是这样。
    我上面的描述不太准确,不是把 string 当 bytes 用,而是 string 就是 utf-8 encoded bytes 。
    因此把 string 往文件写不需要指定编码,string 就是二进制的 bytes,写二进制数据当然不需要指定编码。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具