我尝试使用该xml.etree.ElementTree模块解析带有Python脚本的html文件.根据标题,字符集应为UTF-8.但文件中有一个奇怪的字符.因此,解析器无法解析它.我在Notepad ++中打开文件来查看该字符
.我尝试用几种编码打开它,但我找不到正确的编码.
由于我有许多要解析的文件,我想知道如何删除所有无法解码的字节.有解决方案吗?
我想知道如何删除所有无法解码的字节.有解决方案吗?
这很简单:
with open('filename', 'r', encoding='utf8', errors='ignore') as f:
...
Run Code Online (Sandbox Code Playgroud)
该errors='ignore'告诉Python的下降无法识别的字符.它也可以传递给bytes.decode()大多数其他参与的地方encoding.
由于这会将字节解码为unicode,因此可能不适合想要使用字节的XML解析器.在这种情况下,您应该将数据写回磁盘(例如使用shutil.copyfileobj()),然后在'rb'模式下重新打开.
在Python 2中,内置的这些参数open()不存在,但您可以使用io.open().或者,您可以在读取后将8位字符串解码为unicode字符串,但在我看来这更容易出错.
但事实证明OP没有无效的UTF-8. OP具有有效的UTF-8,恰好包含控制字符.过滤掉控制字符有点烦人,因为你必须通过这样的函数运行它们,这意味着你不能只使用copyfileobj():
import unicodedata
def strip_control_chars(data: str) -> str:
return ''.join(c for c in data if unicodedata.category(c) != 'Cc')
Run Code Online (Sandbox Code Playgroud)
Cc是"其他,控制字符"的Unicode类别,如Unicode网站上所述.要包含更广泛的"坏字符",我们可以删除整个"其他"类别(主要包含无用的东西):
def strip_control_chars(data: str) -> str:
return ''.join(c for c in data if not unicodedata.category(c).startswith('C'))
Run Code Online (Sandbox Code Playgroud)
这将过滤掉换行符,因此最好一次处理一行文件并在最后添加换行符.
原则上,我们可以创建一个用于逐步执行此操作的编解码器,然后我们可以使用copyfileobj(),但这就像使用大锤拍打苍蝇一样.
| 归档时间: |
|
| 查看次数: |
5223 次 |
| 最近记录: |