【问题标题】:ArcPy and Python encoding messing up?ArcPy 和 Python 编码搞砸了?
【发布时间】:2013-10-31 18:18:55
【问题描述】:

我遇到了 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'
原文:Recuperation des données   

导入 arcpy
加载编码:utf-8

arcpy 弄乱了原始类型:输入“unicode”
arcpy 把原文弄乱了:R'cueration des donn'es>   
arcpy 将使用 cp1252 类型的 ReEncode 搞砸:输入“str”
arcpy 将 ReEncode 与 cp1252 文本混淆:Récueration des données>   

【问题讨论】:

    标签: python encoding arcpy


    【解决方案1】:

    回答我的问题。

    从 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 编码,没有签名。

    希望这对任何人都有帮助。

    【讨论】:

      【解决方案2】:

      对于那些有疑问的人,请尝试以下内容(例如,在 .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

      【讨论】:

        猜你喜欢
        • 2012-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-13
        • 1970-01-01
        • 2014-01-16
        • 1970-01-01
        • 2017-05-19
        相关资源
        最近更新 更多