我有一个包含数百个模块的Python项目。在Python 2.6中,源文件(模块)的编码必须是ASCII,除非 存在显式编码声明。有没有一种简单的方法可以找出哪些python模块包含非ASCII字符?所以我可以纠正它们。
此致
答案 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或类似文件