【发布时间】:2019-07-02 13:56:24
【问题描述】:
我有一个文件,.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,,$
【问题讨论】:
-
如果您使用的是 Windows,
^用于 escape characters.,而$通常表示行尾,例如。在正则表达式中。可能是您的文件是“管道分隔的”并且前两个字段为空吗?你用的是什么编辑器,能不能禁用格式化字符的显示? -
文件中的字段以逗号分隔。文件中有 150K 行,除了 81 行坏行,一切都很好。当我在 IDE 中打开时,81 条坏行中的每一行都分为两行(参见上面的 37、38)。上面的示例中给出了两条这样的行(应该是一条)。如果任何字段为空,那没关系,逗号(分隔符)之间没有任何内容。我不确定禁用格式化字符的显示是什么意思。
-
我想删除任何转义字符,例如 ^I,并且我想删除上面第 37 行末尾的新行 $ 字符。如果有代码将删除 ^I 转义字符和行中间的换行符,如第 37 行,因此最终第 37 行和第 38 行是一行,请分享。我尝试了原始帖子中列出的所有选项来删除这两个选项。
标签: python python-3.x csv non-ascii-characters