我遇到了一个问题,给定一个字符串,我想使用 unicodedata.normalize("NFKD",raw_data) 来删除我的数据清理器的特定问题点。然而我遇到了一个巨大的问题,我完全无法弄清楚,这似乎很矛盾。
我从这篇文章中得到了使用 unicodedata.normalize 函数的想法:标准化 Unicode
我认为这会起作用:
raw_data = unicodedata.normalize("NFKD",raw_data)
为了尝试解决问题,我想也许对于每一行我都可以应用标准化,我想也许我的字符串太大了!所以我逐行查看,发现这与字符串的长度无关。我想也许该命令不起作用。我在新窗口中亲自测试了这一点,然后运行了 python。
当我导入 unicodedata 并输入以下行时: unicodedata.normalize("NFKD","清洁冰淇淋机 –\xa0使用湿布或海绵擦拭冰淇淋机的外部和内部,以去除灰尘或污垢。")
输出为:“清洁冰淇淋机 - 使用湿布或海绵擦拭冰淇淋机的外部和内部,以去除灰尘或污垢。” - 正是我想要的!
我会将问题分解为任何用户都可以重现的场景:
假设 raw_data = " 1. 清洁冰淇淋机 –\xa0使用湿布或海绵擦拭冰淇淋机的外部和内部,以去除灰尘或污垢。”(使用 pandas 模块和 gspread 摘自 google 表格)。
然后我会采用这个 raw_data 字符串(通常包含很多很多行 和列表)并创建每行的列表。 (将此列表称为 input_lines)将通过“分割字符串来定义” “。这就是我的问题发生时的代码:
for line in input_lines[0]:
print(line)
print(unicodedata.normalize("NFKD",line))
if line != unicodedata.normalize("NFKD",line):
........
此 input_lines 列表包含“1. 清洁冰淇淋机 –\xa0使用湿布或海绵擦拭冰淇淋机的外部和内部,以去除灰尘或污垢。”。
但是,当需要评估时: line =“1.清洁冰淇淋机 –\xa0使用湿布或海绵擦拭冰淇淋机的外部和内部,以去除灰尘或污垢。”
print(line) = "1. 清洁冰淇淋机 –\xa0使用湿布或海绵擦拭冰淇淋机的外部和内部,以去除灰尘或污垢。"
print(unicodedata.normalize("NFKD",line)) = "1. 清洁冰淇淋机 –\xa0使用湿布或海绵擦拭冰淇淋机的外部和内部,以去除灰尘或污垢。"
但是,如果我只是手动将此字符串放入函数中:
print(unicodedata.normalize("NFKD","1. 清洁冰淇淋机 –\xa0使用湿布或海绵擦拭冰淇淋机的外部和内部,以去除灰尘或污垢。")) = " 1. 清洁冰淇淋机 – 用湿布或海绵擦拭冰淇淋机的外部和内部,以去除灰尘或污垢。”
我已尽一切努力来解决这个问题,我从根本上不明白这里发生了什么,它似乎正在消耗我的灵魂,所以任何帮助将不胜感激。
要回答评论中的问题,当我在 line = "1. 清洁冰淇淋机时执行 repr(line) –\xa0 使用湿布或海绵擦拭冰淇淋机的外部和内部以去除灰尘或污垢”。在for循环中,结果是:
感谢评论中 Michael Ruth 的帮助,我自己解决了这个问题。
我只是使用 .find 函数找到了 unicode 转义序列的位置,并通过遵循语法的预期值进行偏移:
line = line[:line.find("\\x")] + line[line.find("\\x")+4:]
我也使用相同的逻辑对 unicode 组合执行了此操作:
line = line[:line.find("\\u")] + line[line.find("\\u"+6):]