我面临着ArcPy和Python编码之间的一种奇怪的行为。我使用安装了Python for VS (PTVS)的VisualStudio 2010 Shell。我通过一个简单的脚本文件来隔离我的问题。包含以下命令的py脚本文件。在VisualStudio中,我已经将“高级保存选项.”设置为不带签名的UTF-8。脚本只需在屏幕上打印一个重音字符串,然后导入arcpy模块,然后再次打印相同的字符串。导入Arcpy似乎改变了Python的编码设置,但我不知道为什么,我想正确地重新建立它,因为它在原始脚本中的任何地方都会引起一些问题。
我检查了python编码文件夹,并删除了每个pyc文件。而不是运行脚本,它生成了3个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écuperation des données donn<--这是对的导入弧 加载编码: utf-8弧段搞乱原始类型:键入'unicode‘ arcpy搞乱原文:r‘’cuperation des donn‘is >’cuperation<-这是错误的 把ReEncode与cp1252类型混淆:输入'str‘ 把ReEncode与cp1252文本搞混: Récuperation des données> <--这符合原来的unicode
发布于 2013-11-12 14:57:01
回答我的问题。
从ESRI的支持中,我得到了以下信息:
默认情况下,命令行中的python不会将代码页更改为基于UTF-8的文本,以便在Unicode中显示打印语句。另一方面,ArcGIS特别允许将unicode值传递给它,并且已经更改了命令行中的代码页,以便您看到的打印值是ArcGIS正在使用的值。这就是为什么命令行应该是您看到导入系统后面跟着导入弧的唯一环境,并为您提供一个不同的打印值。
由于我的应用程序运行的脚本并不总是需要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编码而不需要签名。
希望这能帮到任何人。
发布于 2015-02-04 10:08:40
对于有疑问的人,请尝试如下(例如,在.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秒的时间。
我得到的是非常好的文本运行第一个版本,胡言乱语时,允许弧加载。
用于桌面版本的ArcGIS : 10.2.1
https://stackoverflow.com/questions/19525319
复制相似问题