删除制表符分隔的txt中所有不可读的字符

时间:2013-11-06 01:02:12

标签: python unicode special-characters python-unicode unicode-escapes

我正在运行一个python程序来处理制表符分隔的txt数据。

但它会带来麻烦,因为它经常有U + 001A等单字节或http://en.wikipedia.org/wiki/Newline#Unicode

中的单字节

(更糟糕的是,除非txt是通过sublime txt打开的,否则甚至看不到这些字符,甚至不是记事本++)

如果python程序在Linux上运行,那么它会自动忽略这些字符,但在Windows上,它不能。

例如,如果txt中有U + 001A,那么python程序会自动认为这是文件的结尾。

再举一个例子,如果txt中有U + 0085,那么python程序会认为这是新行开始的点。

所以我只想要一个单独的程序来清除普通文件开启器中没有显示的每个unicode字符,例如notepad ++(该程序应该适用于Windows)。

我确实想保留像あ和ä这样的东西。但是我只删除了U + 001A和U + 0085之类的东西,这些东西都不是记事本++

如何实现这一目标?

2 个答案:

答案 0 :(得分:2)

没有“unicode character”这样的东西。字符是一个字符,它是如何编码的是在不同的页面上。大写字母“A”可以用很多方式编码,包括UTF-8,EBDIC,ASCII等。

如果要删除无法用ASCII表示的每个字符,则可以使用以下(py3):

a = 'aあäbc'
a.encode ('ascii', 'ignore')

这将产生abc

如果您的文档中确实存在U + 001A(即SUBSTITUTE)字符,则很可能在先前的编码步骤中出现了一些错误。

答案 1 :(得分:0)

使用unicodedata看起来是最好的方法,正如@Hyperboreus(Stripping non printable characters from a string in python)所建议的那样,但是你可以做的很快(在Python 2.x中):

  1. 以二进制模式打开源代码。这可以防止Windows在找到EOL控件字符时截断读取。

    my_file = open("filename.txt", "rb")
    
  2. 解码文件(假设编码为UTF-8:

    my_str = my_file.read().decode("UTF-8")
    
  3. 替换已知的"坏"代码点:

    my_str.replace(u"\u001A", "")
    
  4. 您可以跳过第2步并替换每个"坏"的UTF-8编码值。步骤3中的代码点,例如\x1A,但如果需要,上述方法允许使用UTF-16/32源。