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”

TypeError:在 Python3 中写入文件时需要一个类似字节的对象,而不是“str”

Python3 解析 XML

将 Python3 项目迁移到 AWS

django python3的mysql配置

解决python3 写入中文文本查看为乱码的问题!