如何解决Python3迁移xml写入问题
当前对将代码迁移到Python3(3.6.8)感到沮丧
out_fname是.cproject文件(xml格式)
self.cproject_xml = ET.parse(self.CPROJ_NAME))
with open(out_fname,'a') as cxml:
cxml.write('<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n')
cxml.write('<?fileVersion 4.0.0?>')
self.cproject_xml.write(cxml,encoding='utf-8')
导致:
File "/home/build/workspace/bismuth_build_nightly_py3@2/venv/lib/python3.6/site-packages/tinlane/cprojecttools.py",line 209,in export_cproject
self.cproject_xml.write(fxml)
snips..
File "/usr/lib64/python3.6/xml/etree/ElementTree.py",line 946,in _serialize_xml
write(_escape_cdata(elem.tail))
TypeError: write() argument must be str,not bytes
我尝试了所有不同的方式(请小心,打开文件时需要“ a”)以使其正常工作(发布原始的python2代码,而不是替代文件)。通常我只是在r,a,w中放置一个“ b”即可解决该问题。不,这是行不通的:
(cxml.write('<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n')
TypeError: a bytes-like object is required,not 'str')
即使我转换为字节(我认为是错误的)
重现的最小示例: 创建两个具有以下内容的相同文件(file1,file2):
<note>
<to>minimal</to>
<from>xml</from>
<heading>file</heading>
<body>content</body>
</note>
并运行以下代码块:
import xml.etree.ElementTree as ET
cproject_xml = ET.parse('file1')
fname = 'file2'
with open(fname,'a') as cxml:
cxml.write('<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n')
cxml.write('<?fileVersion 4.0.0?>')
cproject_xml.write(cxml,encoding='utf-8')
使用python2运行时,file2变为:
<note>
<to>minimal</to>
<from>xml</from>
<heading>file</heading>
<body>content</body>
</note>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?><note>
<to>minimal</to>
<from>xml</from>
<heading>file</heading>
<body>content</body>
</note>
有什么想法吗? 谢谢
解决方法
我确定我丢失了一些东西,但是尝试将树(cproject_xml
)写入打开的文件句柄(cxml
)并没有任何意义。
我认为序列化树并直接写入打开的文件更有意义。
尝试更改:
cproject_xml.write(cxml,encoding='utf-8')
收件人:
cxml.write(ET.tostring(cproject_xml.getroot()).decode())
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。