【问题标题】:File encoding error in Python 3.6 with "UTF8" charset带有“UTF8”字符集的 Python 3.6 中的文件编码错误
【发布时间】:2018-04-11 08:31:10
【问题描述】:

我收到一个以 UTF8 编码的带有incoming orders 的 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<Beleg xmlns="http://www.mauve.eu/MauveXml/2.0/"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.mauve.eu/MauveXml/2.0/ http://download.mauve.eu/schema/MauveXml_2_0.xsd"
>

我运行 Python 3.6 脚本将此 XML 文件转换为 CSV 文件。 在脚本中的命令是

soup = BeautifulSoup(open(xmlfile, encoding = 'utf-8'), 'xml')

98% 的情况下,完整的脚本都运行良好。

但是,对于某些 XML 文件,它在我手动更改文本字符之前不起作用,例如:ğě 等。

错误如下:

Traceback (most recent call last):
  File "C:\Modification Python Scripts\Python Script23\test5\New Folder\xmlconvert-final.py", line 180, in <module>
    convertXMLtoCSV(xmlfile,path)
  File "C:\Modification Python Scripts\Python Script23\test5\New Folder\xmlconvert-final.py", line 152, in convertXMLtoCSV
    outputwriter.writerow(i)
  File "C:\Python36\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u202d' in position 83: character maps to <undefined>

有什么想法吗?

【问题讨论】:

  • '\u202d' 是 Unicode LEFT-TO-RIGHT OVERRIDE,而不是 "╩"
  • U+202D 不是您显示的字符,它是Left-to-right Direction Override。我希望看到一个完整的工作示例,包括一个引发此错误的 XML 文件。
  • @Duncan link 在编码部分是How to type in Microsoft Windows Alt +202D
  • 编辑并删除了该错误。 @usr2564301 我无法发布 XML 文件,它是私有数据,不用于公开展示。你所说的工作示例是什么意思?在所有其他 XML 文件中,该脚本都可以正常工作。
  • 您在 Windows 中显示的字符是代码页 437 中的字符 202。在 Unicode 中,这将是字符 "\u2569"。发生的事情是您的 Alt 键序列只使用了 202 而忽略了其余的。无论如何,关键是你有一个给你带来问题的角色 u202d。

标签: xml python-3.x csv character-encoding


【解决方案1】:

如果您查看回溯,您会发现错误发生在 cp1252.py 中,我们可以从中推断您正在使用代码页 1252 编写 CSV 文件。

给您带来问题的字符是一个非常不寻常的 unicode 字符,并且在该代码页中不以任何形式存在。这就是它给你一个错误的原因:没有办法将从左到右的方向覆盖编码到代码页 1252 中。

当您打开 csv 文件时,您可以指定显式编码。如果您不必使用 cp1252,请尝试将其显式设置为 utf-8,因为这将接受任何 unicode 文本。如果您确实必须使用 cp1252,则在 open 调用上设置 errors 参数以忽略或替换编码错误。例如errors='replace' 将用问号替换坏字符:

with open('output_file_name', 'w', newline='', errors='replace') as csv_file:
    writer = csv.writer(csv_file)
    writer.writerow('my_utf8_string')

errors 的可能设置是:

  • 'strict':在编码错误的情况下引发异常
  • '替换': 用合适的替换标记替换格式错误的数据,例如 “?”或'\ufffd'
  • 'ignore':忽略格式错误的数据并继续 进一步通知
  • 'xmlcharrefreplace':用适当的 XML 替换 字符引用(仅用于编码)
  • '反斜杠替换':替换 带有反斜杠的转义序列(仅用于编码)

通常在编码 unicode 时,您应该尝试使用 utf-8 或 utf-16,因为它们可以让您对所有内容进行编码而不会出错。使用任何其他编码可能会遇到无法编码的字符,因此如果必须使用不同的编码,则必须准备好处理这些错误。

【讨论】:

  • 这是我的代码:outputFile = open(filename, 'w', newline='', errors='replace') outputwriter = csv.writer(outputFile) 所以,我刚刚添加了“errors='replace'”,现在脚本也可以使用该 XML 文件。非常感谢@Duncan
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多