Удалить символ градуса из строки, используя Python - PullRequest
0 голосов
/ 01 марта 2019

Я использую Python для чтения текстового файла данных построчно.Одна из строк содержит символ степени.Я хочу изменить эту часть строки.Мой скрипт использует line = line.replace("TEMP [°C]", "TempC").Мой код останавливается на этой строке, но не меняет строку и не выдает ошибку.Очевидно, что в моей замене есть что-то такое, что сценарий не видит 'TEMP [° C]' существующим в моей строке.

Чтобы вставить знак степени в мой сценарий, мне пришлось изменить кодировкув UTF-8 в моих настройках файла IDE.Я включил следующий текст в начало моего сценария.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

Как заменить «TEMP [° C]» на «TempC»?

Я использую Windows 7 иPython 2.7 с Komodo IDE 5.2

Я попытался запустить предложенный код в Python Shell в Komodo, и этот файл изменился.

# -*- coding: utf-8 -*-
line = "hello TEMP [°C]"
line = line.replace("TEMP [°C]", "TempC")
print(line)
hello TempC

Этот предложенный код в Python Shell в Komodo вернулсяthis.

line = "TEMP [°C]"
line = line.replace(u"TEMP [°C]", "TempC")
Traceback (most recent call last):
File "<console>", line 0, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 6: ordinal not in range(128)

Ни одно из этих предложений не сработало при чтении моего текстового файла.

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Этот код отлично работает для меня (Python 2.7.14).Может быть, вы можете указать, сделали ли вы что-то другое, поэтому мы можем взять это оттуда.

# -*- coding: utf-8 -*-

line = "hello TEMP [°C]"
line = line.replace("TEMP [°C]", "TempC")

print(line)
# hello TempC

Примечание: Для меня флаг u не был необходим.

0 голосов
/ 01 марта 2019

Исходя из ваших симптомов, ваши литералы 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 попытаться работать вместе и часто терпеть неудачу" была решена путем полного разделения двух типов.

0 голосов
/ 01 марта 2019

Вы должны использовать флаг u для строкового литерала Unicode:

line = line.replace(u"TEMP [°C]", "TempC")
...