搜索包含非ASCII字符的python模块

时间:2011-08-11 02:21:28

标签: python search character-encoding module ascii

我有一个包含数百个模块的Python项目。在Python 2.6中,源文件(模块)的编码必须是ASCII,除非 存在显式编码声明。有没有一种简单的方法可以找出哪些python模块包含非ASCII字符?所以我可以纠正它们。

此致

3 个答案:

答案 0 :(得分:3)

查看chardet python包。您可以使用与agf相同的os.walk方法并调用chardet.detect方法并标记非ASCII(或置信度值较低)的文件。

这确实留下了一些错误的余地,所以如果你想更加确定,你也可以扫描每个文件中不太可能出现在python文件中的字符(非字母,非标点符号等)。然而,这将不会检测到像UTF-16字符那样具有与两个7位,零填充的ascii字符相同的值,即U+16705< - >。 AA

也就是说,如果要排除的字符来自有限数量的字符集,您应该能够高度自信地找到它们。

答案 1 :(得分:1)

不是很快,但它会起作用。它适用于任何ASCII兼容编码,例如UTF-8,Latin-1等,但不适用于UTF-16。

def find_non_ascii(packagedir):
    for filepath in os.walk(packagedir):
        if not filepath[-1].endswith('.py'):
            continue
        filepath = os.path.join(*filepath)
        for line in open(filepath):
            for char in line:
                if ord(char) > 127:
                    yield filepath
                    doublebreak = True
                    break
            else:
                doublebreak = False
            if doublebreak:
                break

def find_non_ascii(packagedir):
    for filepath in os.walk(packagedir):
        if not filepath[-1].endswith('.py'):
            continue
        filepath = os.path.join(*filepath)
        try:
            open(filepath, 'rb').read().decode('ascii')
        except:
            yield filepath

编辑:第二个版本可能更快。

答案 2 :(得分:1)

open(filename).read().decode("ascii")

如果引发UnicodeDecodeError,那么你有一些非ascii字符

正如Dana所说,这还不足以保证文件不是UTF-16或类似文件