Python3迁移xml写入问题
Posted
技术标签:
【中文标题】Python3迁移xml写入问题【英文标题】:Python3 migration xml write issue 【发布时间】:2021-02-23 16:43:30 【问题描述】:目前对代码迁移到 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')
即使我转换为字节(我认为是错误的)
重现的最小示例: 创建 2 个相同的文件(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>
有什么想法吗? 谢谢
【问题讨论】:
请发布可复制粘贴并运行的独立代码 (minimal reproducible example)。out_fname
是什么?
谢谢,你是对的。这是一个 .cproject Eclipse 文件(xml 格式)
希望现在没问题,加了一个简单的例子
运行代码后 file1 和 file2 应该是什么样子?
这段代码用python2正常运行。所以使用旧版本运行时会提供输出。
【参考方案1】:
我确定我遗漏了一些东西,但是尝试将树 (cproject_xml
) 写入打开的文件句柄 (cxml
) 是没有意义的。
我认为序列化树并直接写入打开的文件会更有意义。
尝试改变:
cproject_xml.write(cxml, encoding='utf-8')
到:
cxml.write(ET.tostring(cproject_xml.getroot()).decode())
【讨论】:
感谢@Daniel,这确实解决了问题,因为我无法开箱即用。标记为已解决,但是如果问题可以按原样解决会很有趣。 Fxml 是一个 TextWrapper obj,所以我想知道这是否可以以某种方式转换。以上是关于Python3迁移xml写入问题的主要内容,如果未能解决你的问题,请参考以下文章
TypeError:在 Python3 中写入文件时需要一个类似字节的对象,而不是“str”