ArcPy和Python编码搞砸了?

ArcPy和Python编码搞砸了?,python,encoding,arcpy,Python,Encoding,Arcpy,我面临着ArcPy和Python编码之间的一种奇怪行为。我使用VisualStudio2010 Shell,并安装了用于VS(PTV)的Python工具。我通过一个简单的脚本文件隔离了我的问题。包含以下命令的py脚本文件。在VisualStudio中,我已将“高级保存选项…”设置为“无签名UTF-8”。脚本只需在屏幕上打印带重音的字符串,然后导入arcpy模块,然后再次打印相同的字符串。导入Arcpy似乎会改变Python编码设置,但我不知道为什么,我想正确地重新启动它,因为它会在原始脚本中的任

我面临着ArcPy和Python编码之间的一种奇怪行为。我使用VisualStudio2010 Shell,并安装了用于VS(PTV)的Python工具。我通过一个简单的脚本文件隔离了我的问题。包含以下命令的py脚本文件。在VisualStudio中,我已将“高级保存选项…”设置为“无签名UTF-8”。脚本只需在屏幕上打印带重音的字符串,然后导入arcpy模块,然后再次打印相同的字符串。导入Arcpy似乎会改变Python编码设置,但我不知道为什么,我想正确地重新启动它,因为它会在原始脚本中的任何地方引起一些问题


我检查了python«encoding»文件夹并删除了每个pyc文件。然后我运行了脚本,它生成了3个pyc文件:

  • cp850.pyc(对应于我的stdout.encoding)
  • cp1252.pyc(对应于我的Windows环境编码)
  • utf_8.pyc(适合我的脚本编码)
  • 导入ArcPy时,会出现一些改变编码的情况,从而影响初始变量

    为什么?

    是否可以使用一些Python命令找到ArcPy encode 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”

    原文:多涅斯之家回答我的问题

    通过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文件中):

    然后再次运行相同的代码,但首先从arcpy行中删除hash注释。还需要大约6秒的时间

    我得到的是运行第一个版本的非常好的文本,在允许加载arcpy时会乱七八糟

    使用的桌面版ArcGIS:10.2.1

    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)