为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Python 3 查找/替换不可打印/非 ASCII 字符?

如何使用 Python 3 查找/替换不可打印/非 ASCII 字符?

尚方宝剑之说 2021-11-02 16:53:23
我有一个文件,.csv 文件中的一些行由于行中某些字段中的时髦字符而阻塞了数据库导入。我已经搜索过,找到了关于如何在 Python 3 中替换非 ascii 字符的文章,但没有任何效果。当我在 vi 中打开文件并执行 :set list 时,在不应该存在的行的末尾有一个 $,而在下一行的开头有 ^I^I。这两行应该是一条连线,没有 ^I 。我知道 $ 是行的结尾 '\n' 并试图替换它们,但没有任何效果。我不知道 ^I 代表什么,可能是一个制表符。我试过这个功能无济于事:def remove_non_ascii(text):    new_text = re.sub(r"[\n\t\r]", "", text)    new_text = ''.join(new_text.split("\n"))    new_text = ''.join([i if ord(i) < 128 else ' ' for i in new_text])    new_text = "".join([x for x in new_text if ord(x) < 128])    new_text = re.sub(r'[^\x00-\x7F]+', ' ', new_text)    new_text = new_text.rstrip('\r\n')    new_text = new_text.strip('\n')    new_text = new_text.strip('\r')    new_text = new_text.strip('\t')    new_text = new_text.replace('\n', '')    new_text = new_text.replace('\r', '')    new_text = new_text.replace('\t', '')    new_text = filter(lambda x: x in string.printable, new_text)    new_text = "".join(list(new_text))    return new_text是否有一些工具可以准确地告诉我这个令人讨厌的角色是什么,然后找到一种方法来替换它?我像这样打开文件(.csv 被保存为 UTF-8)f_csv_in = open(csv_in, "r", encoding="utf-8")下面是两行,应该是问题非 ascii 字符可见的一行。这两行应该是一行。注意第 37 行末尾的 $,第 38 行以 ^I^I 开头。vi 显示的部分问题是第 37 行有一个新行 $,我不希望它出现在那里。这应该是一行。37 Cancelled,01-19-17,,basket,00-00-00,00-00-00,,,,98533,SingleSource,,,17035 Cherry Hill Dr,"L/o 1-19-17 @ 11:45am$38 ^I^IVictorville",SAN BERNARDINO,CA,92395,,,,,0,,,,,Lock:6111 ,,,No,No,,0.00,0.00,No,01-19-17,0.00,0.00,,01-19-17,00-00-00,,provider,,,Unread,00-00-00,,$
查看完整描述

3 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

在不可打印字符的情况下,内置的字符串模块有一些过滤掉不可打印或非 ascii 字符的方法,例如。与isprintable()功能。

一次过滤整个字符串的简洁方法如下所示


>>> import string

>>>

>>> str1 = '\nsomestring'

>>> str1.isprintable()

False

>>> str2 = 'otherstring'

>>> str2.isprintable()

True

>>>

>>> res = filter(lambda x: x in string.printable, '\x01mystring')

>>> "".join(list(res))

'mystring'

这个问题过去曾对SO 进行过一些讨论,但是有很多方法可以做事,所以我理解这可能会令人困惑,因为您可以使用从正则表达式到str.translate()


可以做的另一件事是查看Unicode Categories,并根据您需要的一组符号过滤掉您的数据。


查看完整回答
反对 回复 2021-11-02
?
冉冉说

TA贡献1877条经验 获得超1个赞

一种删除非 ascii 字符的简单方法可能是:

new_text = "".join([c for c in text if c.isascii()])

注意:如果您从文件中读取此文本,请确保使用正确的编码读取


查看完整回答
反对 回复 2021-11-02
  • 3 回答
  • 0 关注
  • 231 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信