Как было намечено в ответе yatima2975, есть дополнительная разница:
substr()
принимает отрицательную стартовую позицию как смещение от конца строки. substring()
нет.
Из MDN :
Если начало отрицательное, substr () использует его как индекс символа с конца строки
Итак, суммируем функциональные отличия:
substring(begin-offset, end-offset-exclusive)
, где начальное смещение -0
или больше
substr(begin-offset, length)
, где начальное смещение также может быть отрицательным
Здесь происходит следующее:
Python 2 не имеет типа для представления необработанных байтов. Вместо этого эти байты представлены строкой, и при печати он пытается вывести байты в виде символов. Однако, если символ не ASCII, это приводит к странным символам со значками вопросительного знака и т. Д.
В Python 3 был представлен тип байтов. Открытие файла как двоичного файла в Python 3 вернет тип байта. При печати типа байтов все байты, которые не могут быть правильно представлены в ASCII, экранируются как что-то между \x00
и \xFF
(шестнадцатеричное).
Таким образом, разница в том, что Python 3 имеет возможность хранить и печатать необработанные байты, а Python 2 - нет.