繁体   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