Я написал свой модуль на Python 3.1.2, но теперь мне нужно проверить его на 2.6.4.
Я не собираюсь публиковать весь свой код, так как это может вызвать путаницу.
Краткое объяснение:
Я пишу синтаксический анализатор XML (мое первое взаимодействие с XML), который создает объекты из файла XML. Есть много объектов, поэтому у меня есть «модульный тест», который вручную сканирует XML и пытается найти подходящий объект. Он распечатает все, что не соответствует.
Я открываю файл XML и использую простой цикл for для построчного чтения файла. Если я сопоставляю регулярное выражение для «приложения» (XML имеет разные узлы «приложения»), то я добавляю его в свой словарь d в качестве ключа. Я выполняю запрос lxml.etree.xpath () для заголовка и сохраняю его как значение.
После того, как я прошёл через все это, я перебираю свой словарь d и пытаюсь сопоставить ключ с моим значением (я должен использовать метод get () из моего класса 'application'). Каждый раз, когда обнаруживается несоответствие, я печатаю ключ и название.
Python 3.1.2 содержит все соответствующие элементы в словаре, поэтому ничего не печатается. В 2.6.4 печатается каждое отдельное значение (~ 600). Я не могу понять, почему мои сравнения строк не работают.
Без лишних слов, вот соответствующий код:
for i in d:
if i[1:-2] != d[i].get('id'):
print('X%sX Y%sY' % (i[1:-3], d[i].get('id')))
Я нарезаю строки, потому что строки разные. Где ключ будет "9626-2008olympics_Prod-SH" \ n, значение будет 9626-2008olympics_Prod-SH, поэтому я должен сократить кавычки и перевод строки. Я также добавил X и Y в операторы печати, чтобы убедиться в отсутствии каких-либо проблем с пробелами.
Вот пример строки вывода:
X9626-2008olympics_Prod-SHX Y9626-2008olympics_Prod-SHY
Не забудьте игнорировать X и Y. Эти строки идентичны. Я не понимаю, почему Python2 не может сравниться с ними.
Edit:
Так что проблема, похоже, в том, что я нарезаю.
В Python3
if i[1:-2] != d[i].get('id'):
это сравнение отлично работает.
В Python2,
if i[1:-3] != d[i].get('id'):
Я должен изменить смещение на единицу.
Зачем строкам нужны разные смещения? Единственное, о чем я могу думать, это то, что Python2 рассматривает новую строку как два символа (то есть '\' + 'n').
Редактировать 2:
Обновлено с запрошенной информацией repr ().
Я добавил небольшой объем кода для получения информации repr () из приведенного выше примера «2008olympics». Я не сделал нарезку. На самом деле это выглядит так, как будто это не проблема юникода. Теперь есть символ "\ r".
Python2:
"9626-2008olympics_Prod-SH" \ г \ п '
'9626-2008olympics_Prod-SH'
Python3:
"9626-2008olympics_Prod-SH" \ п "
'9626-2008olympics_Prod-SH'
Похоже, этот файл был создан / изменен в Windows. Есть ли в Python2 способ автоматически подавлять '\ r'?