使用Python从字符串中删除度数符号

GBG*_*GBG 4 python string unicode character-encoding python-2.7

我正在使用Python逐行读取数据的文本文件.其中一行包含度数符号.我想改变字符串的这一部分.我的脚本使用line = line.replace("TEMP [°C]", "TempC").我的代码在此行停止,但根本不会更改sting,也不会引发错误.很明显,我的替换有一些东西,脚本没有看到我的字符串中存在的'TEMP [°C]'.

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-
Run Code Online (Sandbox Code Playgroud)

如何用'TempC'替换'TEMP [°C]'?

我正在使用Windows 7和Python 2.7与Komodo IDE 5.2

我尝试在Komodo的Python Shell中运行建议的代码并更改了文件.

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

这个在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)
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*ger 6

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

"TEMP [°C]"
Run Code Online (Sandbox Code Playgroud)

你真的得到:

'TEMP [\xc2\xb0C]'
Run Code Online (Sandbox Code Playgroud)

你的文件是其他一些编码(例如latin-1或者cp1252),并且因为你是通过普通的方式阅读它open,所以你得到了未解码的str.但在latin-1cp1252编码时,str'TEMP [\xb0C]'(注缺乏的\xc2),所以str比较不考虑这两个字符串相等.

最好的解决方法是替换你使用openwith io.open,它使用的Python 3版本open可以使用给定的编码无缝解码来生成规范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")
Run Code Online (Sandbox Code Playgroud)

正如您在编辑中描述的那样,您的文件很可能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")
Run Code Online (Sandbox Code Playgroud)

真的,你应该转移到Python 3,其中整个" unicodestr尝试一起工作并经常失败"的事情通过完全拆分这两种类型来解决.

  • @GBG:很高兴我能提供帮助.如果我让我的时间机器工作,我将回到1980年并迫使每个人从一开始就切换到UTF-8作为一个真正的文本编码,所以我们不会遇到处理Windows和它的语言环境 - 特定的ASCII超集一字节每字符编码,只要你的程序中需要一个非ASCII的东西,就会让你感到痛苦. (2认同)