【问题标题】:Writing bytes to file, bad encoding将字节写入文件,编码错误
【发布时间】:2013-09-03 06:54:05
【问题描述】:

我在 Python 3.x 中写入文件时遇到问题,FOR 中的写入函数是在 utf-8 编码中写入捷克符号。 我是 Python 新手,但我为“utf-8”编码设置了 IDE 和 .py、.xml 文件,但我不知道为什么输出文件看起来像这样。 我的代码:

-*- coding: utf-8 -*-
from lxml import etree
from io import BytesIO
import sys
import codecs

f = open('uzivatelska_prirucka.xml','rb')
fo = open('try.xml','wb',1)

header = '?xml version="1.0" encoding="utf-8"?>\n<root\n'
fo.write(bytes(header,'UTF-8'))

some_file_like_object = f
tree = etree.parse(some_file_like_object)
root = tree.getroot() 
node = tree.xpath('/prirucka/body/p');

for a in node:
    for b in a.getiterator():
        if not (b.find('r') is None): 
            text = etree.tostring(b.find('r'))
            fo.write(bytes(str(text),'UTF-8'))

感谢您的帮助和建议

【问题讨论】:

  • 也许写一个合适的左括号...
  • python3 中的open 函数。有一个 encoding 参数,您可以使用它来避免这些显式转换。
  • f = open('uzivatelska_prirucka.xml','rb',encoding='utf-8'),出现错误:二进制模式不带编码参数
  • 您必须在文本模式下打开它,znamená pouze 'r',而不是 'rb'。在 Python 3 中,这里可能不需要使用 codecs 模块。

标签: python encoding python-3.x


【解决方案1】:

是否需要以二进制方式读写??
我认为 XML 文件是一个简单的文本文件,您可以像使用 txt 文件一样使用它
你也应该知道 python3.2 和更新版本的 python 在 ASCII 和 UTF 字符串之间没有任何区别
python3.2 及更高版本将所有字符串视为 unicode 字符串,因此无论字符串是否包含非 ASCII 字符,您都可以在输出文件中写入字符串
另外我发现不需要以二进制模式打开文件以与lxml.etree 包一起使用

尝试以文本模式打开文件(在打开模式下去掉b),看看它是否有效,但请记住告诉open 使用utf-8 编码打开文件

f = open('uzivatelska_prirucka.xml', 'r', encoding='utf-8')
fo = open('try.xml', 'w', 1, encoding='utf-8')

作为旁注,你可以写:

if b.find('r'):  

代替:

if not (b.find('r') is None):  

因为 None 在 if 子句中假定为 False 并且如果 find() 返回 None python 本身不会在 if 块中运行代码并跳转它:

$ python3.3
Python 3.3.1 (default, Apr 17 2013, 22:30:32) 
[GCC 4.7.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print(1) if None else print(0)
0
>>> print(1) if not None else print(0)
1

玩得开心编码;)

【讨论】:

  • 哦,是的,就是这样。但我在将 lxml 对象写入文件时遇到问题。 (etree.tostring(root,pretty_print=True)) 返回类型字节并且文件中的编码错误。有没有没有 lxml 的替代方案?
  • 已解决。我用过 xml.etree.ElementTree
猜你喜欢
  • 2021-01-09
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多