Исходя из ваших симптомов, ваши литералы Python str
заканчиваются как их utf-8
кодировки, поэтому при вводе:
"TEMP [°C]"
вы фактически получаете:
'TEMP [\xc2\xb0C]'
Ваш файл имеет какую-то другую кодировку (например, latin-1
или cp1252
), и, поскольку вы читаете его с помощью простого open
, вы получаете обратно некодированный str
.Но в кодировках latin-1
и cp1252
str
равен 'TEMP [\xb0C]'
(обратите внимание на отсутствие \xc2
), поэтому сравнение str
не считает две строки эквивалентными.
Лучшееисправление заключается в замене использования open
на io.open
, в котором используется версия open
Python 3, которая может беспрепятственно декодировать с использованием заданной кодировки для создания канонических представлений unicode
и аналогичным образом для использования литералов unicode
вместо str
в (на Python) неизвестной кодировке, поэтому нет разногласий относительно правильного способа представления символа степени (в unicode
есть одно и только одно представление):
import io
with io.open('myfile.txt', encoding='cp1252') as f:
for line in f:
line = line.replace(u"TEMP [°C]", u"TempC")
Как вы описываете в своих изменениях, ваш файл, скорее всего, cp1252
(ваш редактор говорит, что это ANSI, , который просто глупый способ описать cp1252
), таким образом, выбранный encoding
.
Примечание. Если вы собираетесь последовательно использовать unicode
в своей программе (неплохая идея, если вы имеете дело с данными, не относящимися к ASCII), вы можете сделать это по умолчанию:
from __future__ import unicode_literals
# All string literals are unicode literals unless prefixed with b, as on Python 2
from io import open # open is now Python 3's open
# No need to qualify with `io.` for `open`, nor put `u` in front of Unicode text
with open('myfile.txt', encoding='cp1252') as f:
for line in f:
line = line.replace("TEMP [°C]", "TempC")
На самом деле вы должны просто перейти на Python 3, где этодыра "unicode
и str
попытаться работать вместе и часто терпеть неудачу" была решена путем полного разделения двух типов.