【问题标题】:Remove a degree symbol from a string using Python使用 Python 从字符串中删除度数符号
【发布时间】:2019-07-22 23:33:10
【问题描述】:

我正在使用 Python 逐行读取数据的文本文件。其中一行包含一个度数符号。我想改变这部分字符串。我的脚本使用line = line.replace("TEMP [°C]", "TempC")。我的代码停在这一行,但根本没有改变刺痛,也没有抛出错误。显然,我的替换存在一些问题,因此脚本没有看到我的字符串中存在“TEMP [°C]”。

为了在我的脚本中插入度数符号,我必须在我的 IDE 文件设置中将编码更改为 UTF-8。我在脚本顶部添加了以下文本。

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

如何将“TEMP [°C]”替换为“TempC”?

我正在使用带有 Komodo IDE 5.2 的 Windows 7 和 Python 2.7

我已尝试在 Komodo 的 Python Shell 中运行建议的代码,结果更改了文件。

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

这个在 Komodo 的 Python Shell 中建议的代码返回了这个。

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)

但在阅读我的文本文件时,这些建议都不起作用。

【问题讨论】:

  • 您的代码在 Python 2.7 交互模式下对我来说工作得很好。
  • 您是使用纯open 打开文件,还是使用io.open 正确/自动解码为unicode?您正在读取的文件的编码是什么?如果您使用纯 open,从非 UTF-8 文件中读取,您将获得与此处不同的 str"TEMP [°C]" 实际上是 'TEMP [\xc2\xb0C]',但如果您正在读取的文件是 latin-1,您会在 'TEMP [\xb0C]' 中读取(注意缺少 \xc2,这是 utf-8 表示所需的)。
  • @GBG:编辑只是更强烈地表明文件的编码不是 UTF-8。是 Windows 还是类 UNIX?如果是后者,尝试在命令行运行file NAMEOFYOURINPUTFILE;我猜它会告诉你类似 NAMEOFYOURINPUTFILE: ISO-8859 text 的内容,而不是 utf-8 文本。
  • @ShadowRanger。我使用下面的链接来确定我正在阅读的文件使用 ANSI 编码。我尝试添加 import io 并使用 io.open 打开文件,但字符串没有改变。stackoverflow.com/questions/3710374/…

标签: python string python-2.7 unicode character-encoding


【解决方案1】:

根据您的症状,您的 Python str 文字最终会作为它们的 utf-8 编码,因此当您键入时:

"TEMP [°C]"

你实际上得到了:

'TEMP [\xc2\xb0C]'

您的文件是其他编码(例如latin-1cp1252),并且由于您是通过纯open 读取它,因此您将返回未解码的str。但是在latin-1cp1252 编码中,str'TEMP [\xb0C]'(注意缺少\xc2),所以str 比较不认为这两个字符串是等价的。

最好的解决方法是将您对open 的使用替换为io.open,它使用open 的Python 3 版本,可以使用给定的编码无缝解码以生成规范的unicode 表示,类似地,在(对于 Python)未知编码中使用 unicode 文字而不是 str,因此在表示度数符号的正确方法上没有分歧(在 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,which is just a dumb way to describe 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,通过完全拆分这两种类型来解决整个“unicodestr 尝试一起工作但经常失败”的问题。

【讨论】:

  • @GBG:很高兴我能帮上忙。如果我能让我的时间机器工作,我将回到 1980 年,并迫使每个人从一开始就切换到 UTF-8 作为一种真正的文本编码,这样我们就不会被 Windows 和它的语言环境所困-特定的 ASCII 超集每个字符一个字节的编码,当你在程序中需要一个非 ASCII 的东西时,它什么也不做,只会让你感到痛苦。
【解决方案2】:

您应该将u 标志用于 unicode 字符串文字:

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

【讨论】:

  • @mrk - 我尝试了这两种方法,但都没有奏效。我不明白为什么这些不起作用。
【解决方案3】:

这段代码对我来说运行良好(Python 2.7.14)。 也许你可以指出你是否做了一些不同的事情,所以我们可以从那里得到它。

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

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

print(line)
# hello TempC

注意:对我来说,不需要 u 标志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-19
    • 2016-11-22
    • 2010-10-26
    • 1970-01-01
    • 2015-07-07
    • 2013-05-19
    • 2012-06-25
    • 2017-09-24
    相关资源
    最近更新 更多