'Python3 migration xml write issue

Currently frustrated with code migration to Python3 (3.6.8)

out_fname is a .cproject file (xml format)

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')

leads to:

  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

I have tried all different ways (be careful, i need the "a" when opening my file) to make it work (posting original python2 code, not the alternates). Usually i just placed a "b" in r,a,w which would solve the problem. No it doesn't work:

(cxml.write('<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n')
TypeError: a bytes-like object is required, not 'str')

even when i convert to bytes (wrong in my opinion)

Minimal Example to reproduce: create 2 identical files (file1, file2) with the following content:

<note>
  <to>minimal</to>
  <from>xml</from>
  <heading>file</heading>
  <body>content</body>
</note>

and run this codeblock:

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')

When run with python2, file2 becomes:

<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>

Any ideas? Thanks



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source