Python unicode 比较在终端失败但在 Spyder 编辑器中正常
我需要把一个从utf-8文件中读取的unicode字符串和在Python脚本中定义的常量进行比较。
我在Linux上使用的是Python 2.7.6。
当我在Spyder(一个Python编辑器)中运行这个脚本时,一切正常,但如果我在终端中运行这个Python脚本,测试就失败了。我是否需要在终端中做些什么,比如导入或定义某些东西,才能成功运行这个脚本?
脚本 ("pythonscript.py"):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import csv
some_french_deps = []
idata_raw = csv.DictReader(open("utf8_encoded_data.csv", 'rb'), delimiter=";")
for rec in idata_raw:
depname = unicode(rec['DEP'],'utf-8')
some_french_deps.append(depname)
test1 = "Tarn"
test2 = "Rhône-Alpes"
if test1==some_french_deps[0]:
print "Tarn test passed"
else:
print "Tarn test failed"
if test2==some_french_deps[2]:
print "Rhône-Alpes test passed"
else:
print "Rhône-Alpes test failed"
utf8_encoded_data.csv:
DEP
Tarn
Lozère
Rhône-Alpes
Aude
在Spyder编辑器中的运行输出:
Tarn test passed
Rhône-Alpes test passed
在终端中的运行输出:
$ ./pythonscript.py
Tarn test passed
./pythonscript.py:20: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
if test2==some_french_deps[2]:
Rhône-Alpes test failed
3 个回答
0
因为你在比较一个字符串对象和一个unicode对象,所以Python会给你发出这个警告。
要解决这个问题,你可以这样写:
test1 = "Tarn"
test2 = "Rhône-Alpes"
改成这样:
test1 = u"Tarn"
test2 = u"Rhône-Alpes"
这里的'u'表示这是一个unicode对象。
1
你只需要用 depname = rec['DEP']
这一行代码就可以了,因为你已经设置了编码。
如果你用 print some_french_deps[2]
这行代码,它会显示 Rhône-Alpes
,这样你的比较就能正常工作了。
1
你正在比较一个字节字符串(类型是 str
)和一个 unicode
值。Spyder 这个工具把默认的编码方式从 ASCII 改成了 UTF-8。在比较这两种类型的时候,Python 会自动进行转换。你的字节字符串是用 UTF-8 编码的,所以在 Spyder 中,这个比较是成功的。
解决办法是 不要 使用字节字符串,而是用 unicode
字面量来表示你的两个测试值:
test1 = u"Tarn"
test2 = u"Rhône-Alpes"
我认为改变系统的默认编码是个糟糕的主意。你的代码应该正确使用 Unicode,而不是依赖于自动转换。改变自动转换的规则只会让事情变得更加混乱,并不会让任务变得更简单。