簡體   English   中英

python unicode相等比較在終端中失敗,但在Spyder編輯器下工作

[英]Python unicode equal comparison failed in terminal but working under Spyder editor

我需要將來自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

您正在將一個字節字符串(類型str )與一個unicode值進行比較。 Spyder已將默認編碼從ASCII 更改為UTF-8,並且當比較這兩種類型時,Python會在字節字符串和unicode值之間進行隱式轉換。 您的字節字符串被​​編碼為UTF-8,因此在Spyder下,比較成功。

解決方案是使用字節字符串,而將unicode文字用作兩個測試值:

test1 = u"Tarn"
test2 = u"Rhône-Alpes"

在我看來,更改系統默認編碼是一個糟糕的主意。 您的代碼應正確使用Unicode而不是依賴隱式轉換,但是更改隱式轉換的規則只會增加混亂,而不會使任務變得更簡單。

僅使用depname = rec['DEP']可以了,因為您已經聲明了編碼。

如果您print some_french_deps[2] ,它將打印Rhône-Alpes因此您的比較將有效。

當您將字符串對象與unicode對象進行比較時,python會拋出此警告。

要解決此問題,您可以編寫

test1 = "Tarn"
test2 = "Rhône-Alpes"

test1 = u"Tarn"
test2 = u"Rhône-Alpes"

其中的“ u”表示它是一個unicode對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM