Поиск файла Unicode с использованием Python - PullRequest
1 голос
/ 06 августа 2009

Настройка

Я пишу скрипт для обработки и аннотирования журналов сборки из Visual Studio. Журналы сборки - это HTML, и, насколько я могу судить, Unicode (UTF-16?). Вот фрагмент из одного из файлов:

c: \ anonyfolder \ anonyfile.c (17169): предупреждение C4701: потенциально неинициализированная локальная переменная 'object_adrs2' используется
c: \ anonyfolder \ anonyfile.c (17409): предупреждение C4701: потенциально неинициализированная локальная переменная 'pclcrd_ptr' используется
c: \ anonyfolder \ anonyfile.c (17440): предупреждение C4701: потенциально неинициализированная локальная переменная 'object_adrs2' используется

Первые 16 байтов файла выглядят так:

feff 003c 0068 0074 006d 006c 003e 000d

Остальная часть файла также усеяна нулевыми байтами.

Я бы хотел иметь возможность выполнять поиск / совпадение строк и регулярных выражений в этих файлах. Однако, когда я пытаюсь использовать следующий код, я получаю сообщение об ошибке.

buildLog = open(sys.argv[1]).readlines()

for line in buildLog:
    match = u'warning'
    if line.find(match) >= 0:
        print line

Сообщение об ошибке:

Traceback (последний последний вызов):
Файл "proclogs.py", строка 60, в
if line.find (match)> = 0:
UnicodeDecodeError: кодек «ascii» не может декодировать байт 0xff в позиции 0: порядковый номер не в диапазоне (128)

Очевидно, он задыхается от 0xff байта в 0xfeff в начале файла. Если я пропущу первую строку, я не получу совпадений:

buildLog = open(sys.argv[1]).readlines()

for line in buildLog[1:]: # Skip the first line.
    match = u'warning'
    if line.find(match) >= 0:
        print line

Аналогично, использование не-Unicode match = 'warning' не дает результатов.

Вопрос

Как я могу переносить поиск файла Unicode, используя строки и регулярные выражения в Python? Кроме того, как я могу сделать так, чтобы я мог восстановить исходный файл? (Цель состоит в том, чтобы иметь возможность писать аннотации в строках предупреждения без искажения файла.)

Ответы [ 2 ]

7 голосов
/ 06 августа 2009

Попробуйте использовать пакет кодеков:

import codecs
buildLog = codecs.open(sys.argv[1], "r", "utf-16").readlines()

Кроме того, у вас могут возникнуть проблемы с оператором печати, поскольку он может попытаться преобразовать строки в кодировку консоли. Если вы печатаете для обзора, вы можете использовать,

print repr(line)
0 голосов
/ 06 августа 2009

пробовал это? При сохранении сценария синтаксического анализа с использованием символов, отличных от ascii, я попросил интерпретатора предложить альтернативную кодировку в начале файла.

Non-ASCII found, yet no encoding declared.  Add a line like:
# -*- coding: cp1252 -*-

Добавление в качестве первой строки скрипта исправило проблему для меня. Не уверен, что именно это и является причиной вашей ошибки.

...