0

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

但它会引起麻烦,因为它通常具有 U+001A 或http://en.wikipedia.org/wiki/Newline#Unicode等 unicode

(更糟糕的是,除非用 sublime txt 打开 txt,否则甚至看不到这些字符,甚至用 notepad++ 也看不到)

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

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

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

所以我只想要一个单独的程序,它可以清除普通文件打开器(如记事本++)中未显示的每个 unicode 字符(并且该程序应该在 Windows 上运行)。

我确实想保留 あ 和 ä 之类的东西。但我只删除了记事本++看不到的 U+001A 和 U+0085 之类的东西

如何做到这一点?

4

2 回答 2

2

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

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

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

这将产生abc.

如果您的文档中确实有 U+001A,即 SUBSTITUTE,字符,则很可能在之前的编码步骤中出现了问题。

于 2013-11-06T01:26:37.630 回答
0

使用 unicodedata 看起来是最好的方法,正如@Hyperboreus (从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", "")
    

例如,您可以跳过第 2 步并替换第 3 步中每个“错误”代码点的 UTF-8 编码值\x1A,但如果需要,上述方法允许使用 UTF-16/32 源。

于 2013-11-06T16:26:48.433 回答