我正在使用Python逐行读取数据的文本文件。其中一行包含度数符号。我想更改字符串的这一部分。我的脚本使用line = line.replace("TEMP [°C]", "TempC")
。我的代码在此行停止,但完全不会改变字符串,也不会引发错误。显然,我的替换操作有些问题,因此脚本看不到字符串中存在'TEMP [°C]'。
为了在我的脚本中插入度数,我必须在我的IDE文件设置中将编码更改为UTF-8。我在脚本顶部添加了以下文本。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
如何将“ TEMP [°C]”替换为“ TempC”?
我正在将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
此建议的代码在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)
尽管这些建议在阅读我的文本文件时都无效。
答案 0 :(得分:6)
根据您的症状,您的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版本,该版本可以使用给定的编码无缝解码以产生规范的{{1 }}表示形式,并且类似地,在Python未知编码中使用unicode
文字而不是unicode
,因此在表示度数符号的正确方法上并没有分歧(在{{1}中},只有一种表示形式:
str
正如您在编辑中所描述的,您的文件很可能是unicode
(您的编辑器说它是ANSI,which is just a dumb way to describe cp1252
),因此选择了import io
with io.open('myfile.txt', encoding='cp1252') as f:
for line in f:
line = line.replace(u"TEMP [°C]", u"TempC")
。
注意:如果要在整个程序中始终使用cp1252
(如果处理非ASCII数据,这是一个不错的主意),则可以将其设为默认值:
encoding
真的,您应该转到Python 3,通过完全拆分两种类型,解决了整个“ unicode
和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")
一起工作并经常失败”的问题。
答案 1 :(得分:2)
您应将u
标志用于unicode字符串文字:
line = line.replace(u"TEMP [°C]", "TempC")
答案 2 :(得分:1)
这段代码对我来说很好用(Python 2.7.14)。 也许您可以指出您是否做了其他事情,所以我们可以从那里开始。
# -*- coding: utf-8 -*-
line = "hello TEMP [°C]"
line = line.replace("TEMP [°C]", "TempC")
print(line)
# hello TempC
注意: 对我来说,不需要u标志。