Python unicode 比较在终端失败但在 Spyder 编辑器中正常

1 投票
3 回答
876 浏览
提问于 2025-04-18 08:33

我需要把一个从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,而不是依赖于自动转换。改变自动转换的规则只会让事情变得更加混乱,并不会让任务变得更简单。

撰写回答