V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
amiwrong123
V2EX  ›  Python

xml.dom.minidom 写入 xml 文本会报错, UnicodeEncodeError: 'gbk' codec can't encode character

  •  
  •   amiwrong123 · 11 天前 · 700 次点击

    xml 文件如下:

    <?xml version="1.0" ?>
    <Floor floorNumber="1" floorRefId="723413320329068590" isOutdoor="false" name="DevNetZone" objectVersion="19">
        <Dimension height="16.5" length="81.9" offsetX="0.0" offsetY="0.0" unit="FEET" width="307.0"/>
        <Image imageName="domain_0_1421088463647.png"/>
        <GPSMarker name="GPS_Marker_17">
            <GeoCoordinate latitude="36.125859" longitude="-97.066969" unit="DEGREES"/>
            <MapCoordinate unit="FEET" x="0.6" y="0.6"/>
        </GPSMarker>
    
        <assign expr="split('&#xFFFD;')"/>
    </Floor>
    

    程序如下:就是单纯读取一个 xml,再一模一样地写入一个新的 xml 文件里。

    from xml.dom.minidom import parse
    
    domTree = parse("test.xml")
    
    with open('new.xml', 'w') as f:
        # 缩进 - 换行 - 编码
        domTree.writexml(f, addindent='  ', encoding='utf-8')#这里会报错,去掉 encoding 参数也一样
    

    报错信息如下:

    UnicodeEncodeError: 'gbk' codec can't encode character '\ufffd' in position 7: illegal multibyte sequence
    

    就因为 xml 文件有这么个 FFFD,所以才报错。但现在不知道咋解决。难道应该 parse 函数加个 encoding 参数吗,就不能把这个 FFFD 当成字符串来读取吗。。

    各位大佬帮忙看看吧,有点蒙。

    12 条回复    2021-01-14 11:24:07 +08:00
    xiaolinjia
        1
    xiaolinjia   11 天前
    with open('new.xml', 'w', encoding='utf-8') as f:
    # 缩进 - 换行 - 编码
    domTree.writexml(f, addindent=' ')
    打开文件的时候就指定编码吧。
    amiwrong123
        2
    amiwrong123   11 天前
    @xiaolinjia #1
    貌似这个 parse 函数,没有这样的参数。。
    xiaolinjia
        3
    xiaolinjia   11 天前
    @amiwrong123 我说的 open 函数啊。
    amiwrong123
        4
    amiwrong123   11 天前
    @xiaolinjia #3
    哈哈,不好意思,刚才眼瞎了。谢谢,解决了。
    amiwrong123
        5
    amiwrong123   11 天前
    @xiaolinjia #3
    <img src="https://s3.ax1x.com/2021/01/13/sNQ8gJ.png" alt="sNQ8gJ.png" border="0" />
    不对,没有解决。只是回避了问题,现在执行不报错了,但这是因为忽略掉了 utf8 不认识的字符了,现在生成的新文件,变成这个了。
    xiaolinjia
        6
    xiaolinjia   11 天前
    @amiwrong123 可是,'&#xFFFD;'本来就是'�'这个吧
    amiwrong123
        7
    amiwrong123   11 天前
    @xiaolinjia #6
    好吧,那有点好奇,为啥不是按照'&#xFFFD;'来显示,而是直接显示这个特殊字符了。就因为转了一下吗
    ysc3839
        8
    ysc3839   11 天前 via Android
    @amiwrong123 你设置了 encoding=utf-8,这个字符能在 utf-8 中表示,所以就不用转义了。
    如果一定要转义的话,用 ascii 编码。
    est
        9
    est   11 天前
    gbk 一般都是 windows 搞出来的问题。2333
    amiwrong123
        10
    amiwrong123   11 天前
    @ysc3839 #8
    with open('new.xml', 'w',encoding='ascii') as f:
    # 缩进 - 换行 - 编码
    domTree.writexml(f, addindent=' ', encoding='ascii')

    这样子,会直接报错的。UnicodeEncodeError: 'ascii' codec can't encode character '\ufffd' in position 7: ordinal not in range(128).
    ysc3839
        11
    ysc3839   11 天前
    @amiwrong123 那可能是 xml 库不支持?印象中设置成 ascii 编码,就会把非 ascii 字符都转义输出的。
    zyb201314
        12
    zyb201314   10 天前 via Android
    #二进制读取.
    f=open ("new.xml","wb")
    for i in open("output.xml","rb"):
    f.write(i)

    f.close()
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1298 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:16 · PVG 02:16 · LAX 10:16 · JFK 13:16
    ♥ Do have faith in what you're doing.