Поиск модулей Python, содержащих не-ASCII символы - PullRequest
2 голосов
/ 11 августа 2011

У меня есть проект Python, содержащий сотни модулей.В Python 2.6 кодировка исходных файлов (модулей) должна быть ASCII, если нет явного объявления кодировки.Есть ли простой способ узнать, какие модули Python содержат не-ASCII символы?Так что я могу исправить их.

С уважением,

Ответы [ 3 ]

3 голосов
/ 11 августа 2011

Посмотрите на пакет chardet python.Вы можете использовать тот же подход os.walk, что и agf, и вызывать метод chardet.detect и помечать файлы, которые не являются ASCII (или с более низким значением достоверности).

Хотя это оставляет место для ошибки,если вы хотите быть более уверенным, вы также можете отсканировать каждый файл на наличие символов, которые вряд ли появятся в файле python (не алфавит, пунктуация и т. д.).Однако это не обнаружит такие вещи, как символы UTF-16, которые имеют то же значение, что и два 7-разрядных символа ascii с добавлением нуля, т.е. U+16705 <-> AA.

.символы, которые вы хотите исключить, относятся к ограниченному числу наборов символов, и вы должны быть в состоянии найти их с высокой достоверностью.

1 голос
/ 11 августа 2011
open(filename).read().decode("ascii")

Если это вызывает UnicodeDecodeError, у вас есть несколько символов не ascii

Как говорит Дана, этого недостаточно, чтобы гарантировать, что файл не является UTF-16 или подобным

1 голос
/ 11 августа 2011

Не очень быстро, но это будет работать. Он будет работать для любой 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

Редактировать: Эта вторая версия, вероятно, быстрее.

...