2013-10-22 89 views
3

我面臨ArcPy和Python編碼之間的奇怪行爲。我使用VisualStudio 2010 Shell與安裝了VS(Python的PTVS)的Python工具一起工作。我通過一個簡單的腳本文件隔離了我的問題。包含以下命令的py腳本文件。在VisualStudio中,我已將「高級保存選項...」設置爲「無簽名」的「UTF-8」。該腳本只是在屏幕上打印重音字符串,然後導入arcpy模塊,然後再次打印相同的字符串。導入Arcpy似乎改變了Python編碼設置,但我不知道爲什麼,我想正確地重新安裝它,因爲它會在原始腳本中的任何地方造成一些問題。ArcPy和Python編碼搞亂了嗎?


我檢查了python«encoding»文件夾並刪除了每個pyc文件。比我跑的腳本,它生成的3個PYC文件:

  1. cp850.pyc(相當於我stdout.encoding)
  2. cp1252.pyc(相當於我的Windows環境下的編碼)
  3. UTF_8 .pyc(適合我的腳本編碼)

當ArcPy被導入時,某些內容會改變影響初始變量的編碼。

爲什麼?

是否有可能通過一些Python命令找到ArcPy編碼cp1252所在的位置並讀取它,以便我可以創建一個處理它的函數?

# -*- coding: utf-8 -*- 
import sys 
print ('Loaded encoding : %(t)s'%{'t':sys.getdefaultencoding()}) 
reload(sys) # See stackoverflow question 2276200 
sys.setdefaultencoding('utf-8') 
print ('Set default encoding : %(t)s'%{'t':sys.getdefaultencoding()}) 
print '' 

texte = u'Récuperation des données' 
print ('Original type : %(t)s'%{'t':type(texte)}) 
print ('Original text : %(t)s'%{'t':texte}) 
print '' 

import arcpy 
print ('imported arcpy') 
print ('Loaded encoding : %(t)s'%{'t':sys.getdefaultencoding()}) 
print '' 

print ('arcpy mess up original type : %(t)s'%{'t':type(texte)}) 
print ('arcpy mess up original text : %(t)s'%{'t':texte}) 
print '' 

print ('arcpy mess up reencoded with cp1252 type : %(t)s'%{'t':type(texte.encode('cp1252'))}) 
print ('arcpy mess up reencoded with cp1252 text : %(t)s'%{'t':texte.encode('cp1252')}) 

raw_input() 

,當我運行該腳本,我得到這些結果:

加載編碼:ASCII
集編碼:UTF-8

原始型: 'unicode' 時
原始文本:Récuperationdesdonnées      < ---這是正確的

進口ArcPy中
加載編碼:UTF-8

ArcPy中弄亂原始類型:類型碼爲
ArcPy中弄亂原文:R'cuperation DES donn'es>       < - - 這是錯誤
ArcPy中亂了重新編碼與CP1252型:「海峽」
ArcPy中亂了重新編碼與CP1252文字:調養宮最近搜索>       < ---這是符合與初始unicode

回答

2

回答我的問題。

從ESRI的支持,我得到了這樣的信息:

默認情況下,蟒蛇在命令行不會將代碼頁更改爲UTF-8基於文本的打印語句以Unicode顯示。另一方面,ArcGIS專門允許將unicode值傳遞給它,並且已更改命令行中的代碼頁,以使您看到的值爲ArcGIS正在使用的值。這就是爲什麼命令行應該是您看到導入sys後跟import rpypy的唯一環境,爲您提供了不同的打印值。

由於並不總是需要ArcPy中,這取決於什麼,我想要它做的,解決我的問題我的應用程序運行的腳本,我做了一個泛型函數與編碼交易,ArcPy中是否已被導入,利用所提供的信息:

Coding_CMD_Window = sys.stdout.encoding 
Coding_OS = locale.getpreferredencoding() 
Coding_Script = sys.getdefaultencoding() 
Coding2Use = Coding_CMD_Window 
if any('arcpy' in importedmodules for importedmodules in sys.modules): 
    Coding2Use = Coding_OS 

而且,我確信,我所有的腳本有適當的UTF-8編碼沒有簽名。

希望這可以幫助任何人。

0

對於那些有疑問,你可以試試下面的(例如,在.py文件):

import codecs 
#import arcpy 

f = codecs.open('utf.file.txt', encoding='utf-8-sig') #assuming a BOM present 
l = f.readlines() 
print u''.join(l) 

然後再次運行相同的代碼,但首先請從ArcPy中線上的哈希評論。這將需要6秒多的時間。

我得到的是運行第一個版本的完美文本,允許加載arcpy時出現亂碼。

使用的ArcGIS for Desktop版本:10.2.1