2013-09-25 124 views
8

我处理在Python大量的CSV文件。这些文件是从外部组织接收的,并用一系列编码进行编码。我想找到一个自动化的方法来删除以下内容:删除不可打印的“小鬼”从文本文件字符

  • 非ASCII字符
  • 控制字符
  • 空(ASCII 0)字符

我有一种名为“查找并替换它!'那将使用正则表达式,所以用正则表达式解决上述问题的方法将非常有用。

谢谢

+0

'的文件是从外部组织接收,并与一系列encodings'的编码 - 而这些都是...向他们不要?你有什么相关的产品与此有关?你想用什么数据...你真的需要Python吗? –

+0

好问题。 CSV文件。编码包括“未知”(根据查找和替换它!),'utf-8','iso-88591-1'等。不能问他们 - 太多的电子邮件太久了。我已经写了重新格式化CSV文件的Python。这个脚本在大多数情况下都能工作,除非gremlins(某种程度上相当于\ r)搞砸了CSV.reader。删除非asciis然而编码将排序我。干杯! –

+0

感谢所有这些评论。在急于完成工作的过程中,我使用了一些名为BBEdit的命令,它将删除'gremlins',例如用python无法识别的编码编码的/ r字符(没有进一步的工作)。现在我知道如何使用BBEdit来识别这些gremlins,我将检查下面的任何解决方案是否做同样的事情,并勾选第一个答案。 –

回答

5

您可能会感兴趣的另一种方法是:

import string 
clean = lambda dirty: ''.join(filter(string.printable.__contains__, dirty)) 

它只是从它接收到的脏串过滤掉所有非打印字符。

>>> len(clean(map(chr, range(0x110000)))) 
100 
5

试试这个:

clean = re.sub('[\0\200-\377]', '', dirty) 

的想法是每个NUL或“高ASCII”字符匹配(即\ 0和那些不适合在7位)和删除。您可以添加更多的字符,例如ASCII ESC或BEL。

或者这样:

clean = re.sub('[^\040-\176]', '', dirty) 

的想法是只允许有限范围内“可打印的ASCII,”但请注意,这还将删除换行符。如果您想保留换行符或制表符等,只需将它们添加到括号中即可。

+0

谢谢。将尝试今天回来。我不需要保留制表符,但我确实需要换行符(并且希望csv外壳中的有效CR)可以保留,但是需要编码。 –

2

更换任何不期望的字符用空白(删除):

clean = re.sub('[^\s!-~]', '', dirty) 

这使得所有的空格(空格,换行,制表符等),以及所有“正常”的字符(!是第一个ascii可打印和~是在十进制128下最后ascii可打印)。