簡體   English   中英

ArcPy和Python編碼亂七八糟?

[英]ArcPy and Python encoding messing up?

我面臨着ArcPy和Python編碼之間的奇怪行為。 我使用VisualStudio 2010 Shell安裝了用於VS(PTVS)的Python工具。 我通過一個簡單的腳本文件隔離了我的問題。 py腳本文件包含以下命令。 在VisualStudio中,我已將“高級保存選項...”設置為“無簽名的UTF-8”。 該腳本只需在屏幕上打印一個帶重音的字符串,然后導入arcpy模塊,然后再打印相同的字符串。 導入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搞砸原始類型:輸入'unicode'
arcpy搞亂原文:R'cuperation des donn'es> <---這是錯誤的
arcpy亂了用cp1252類型的ReEncode:輸入'str'
arcpy亂七八糟的ReEncode與cp1252文本:Récuperationdesdonnées> <---這適合原始的unicode

回答我的問題。

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

默認情況下,命令行中的python不會將代碼頁更改為基於UTF-8的文本,以便以Unicode顯示打印語句。 另一方面,ArcGIS專門允許將unicode值傳遞給它並更改了命令行中的代碼頁,以便您看到的值打印為ArcGIS正在使用的值 這就是為什么命令行應該是唯一一個環境,你看到import sys后面跟着import arcpy給你一個不同的打印值。

由於我的應用程序運行的腳本並不總是需要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編碼,沒有簽名。

希望這有助於任何人。

對於有疑問的人,請嘗試以下內容(例如,在.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

暫無
暫無

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

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