Python—将xml中的特定行转换为小写并写回—utf-8问题

Python—将xml中的特定行转换为小写并写回—utf-8问题,python,xml,python-2.7,utf-8,Python,Xml,Python 2.7,Utf 8,基本上,我正在尝试转换xml文件中包含小写“Account”的所有行,并将其写回文件 我的XML如下所示: <?xml version="1.0" encoding="UTF-8"?> <TRAINERERADMINSTRATIONOBJECTS> <TRAINERLIST> <TRAINER> <Account>Täst</Account> <Mark>pUIPBPp8TW

基本上,我正在尝试转换xml文件中包含小写“Account”的所有行,并将其写回文件

我的XML如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<TRAINERERADMINSTRATIONOBJECTS>
  <TRAINERLIST>
    <TRAINER>
      <Account>Täst</Account>
      <Mark>pUIPBPp8TWw=</Mark>
      <Type>lala</Type>
      <Business>sghs</Business>
    </TRAINER>
  </TRAINERLIST>
</TRAINERADMINSTRATIONOBJECTS>
出现此错误时:

UnicodeEncodeError:“ascii”编解码器无法对字符u'\xe4'进行编码


我试图在脚本中的任何地方对其进行解码(并拼命编码),但没有成功。

正如tdelaney在评论中提到的,您的代码有几个问题。您以读取模式打开了文件,但在
for
循环中,当您在当前行中检测到“Account”时,您尝试再次打开该文件,然后尝试以写入模式再次打开该文件;那是行不通的

有多种方法可以满足您的需要,但这里有一个在Python2.6中工作的解决方案。我已将示例数据保存到名为“test.xml”的UTF-8编码文件中

重新导入
iname=“test.xml”
oname=“test_out.xml”

pat=re.compile(“(\s*找到目标行并进行替换。请注意,它通常是一个,但如果您能保证输入数据将始终以简单、已知的格式进行,则可以不使用它。

您可能希望使用xml.etree.ElementTree来解析此xml文件

但是,您可能需要尝试:

with open("buht.xml", "rb") as s:
    for line in s:
        if 'Account' in line:
            line = line.decode('utf-8')
我不确定您的处理是关于什么的,但您可能希望将它们附加到列表中,然后稍后写入文件。看起来您试图在不同的时间读取和写入同一文件


此外,如果
行中的
中的'Account'在
行中的不同部分也有'Account',则使用
可能会返回true。如果使用xml.etree.ElementTree解析,则不会出现此问题。

ElementTree解决方案:

from xml.etree import ElementTree as et
tree = et.parse('test.xml')
for e in tree.iterfind('.//Account'):
    e.text = e.text.lower()
tree.write('test_out.xml',encoding='UTF-8',xml_declaration=True)

根据另一个答案中的注释,这将把空的打开/关闭标记(如
)转换为具有相同含义的单个但仍然有效的XML,
。它解析为相同的内容,因此您不必担心。

您检查过了吗?没有,但在原始源文件中还有一些其他错误,如“u”\xdc”或其他一些错误……我知道我会仔细检查这个问题的,谢谢!您的代码有几个问题,但最直接的问题是您在编写之前没有将字符串编码为UTF8。您确实需要提到您使用的是哪个Python版本,因为Python 2中的Unicode处理与Python 3非常不同。好吧,代码有很多问题,我是Python新手,所以我尝试不使用o了解…我正在使用Python2.7…我将尝试在写回之前对其进行编码,谢谢!我还尝试了另一种方法,将文件读入为xml并降低特定值。不幸的是,他删除了所有空标记的尾端标记,这也不好…在询问之前我确实尝试了很多…我还尝试了元素树它很好,但是还有一个关于标签的问题,如果标签是空的,那就是删除了…谢谢你的帮助,我会这样做的,哦,我的天……你让我的一天。谢谢你!”问答:我的荣幸!因为我的回答对你有帮助,请考虑一下。哦,好的,很高兴知道XML仍然有效,尽管语法不同。因此,我的ElementTree代码版本可以工作,即使您的代码更好、更高效。谢谢!编辑:我使用了您的代码,它工作得很好,唯一的问题是(我的代码也有问题):如果是大型xml,我会遇到以下错误:
ParseError:格式不正确(无效标记):第2050行,第36列
您可能在该行上有一个不匹配的标记…一个open,没有close,反之亦然。例如,您的原始示例有一个。选中此选项,但所有标记都已关闭。我猜这是因为某些字符,如“&”或“§”等等
<?xml version="1.0" encoding="UTF-8"?>

<TRAINERADMINSTRATIONOBJECTS>
  <TRAINERERLIST>
    <TRAINER>
      <Account>täst</Account>
      <Mark>pUIPBPp8TWw=</Mark>
      <Type>lala</Type>
      <Business>sghs</Business>
    </TRAINERER>
  </TRAINERLIST>
</TRAINERADMINSTRATIONOBJECTS>
with open("buht.xml", "rb") as s:
    for line in s:
        if 'Account' in line:
            line = line.decode('utf-8')
from xml.etree import ElementTree as et
tree = et.parse('test.xml')
for e in tree.iterfind('.//Account'):
    e.text = e.text.lower()
tree.write('test_out.xml',encoding='UTF-8',xml_declaration=True)