Кодирование ArcPy и Python путается?

Я столкнулся со странным поведением между кодировкой ArcPy и Python. Я работаю с VisualStudio 2010 Shell с установленными инструментами Python для VS (PTVS). Я изолировал свою проблему с помощью простого файла сценария. Файл сценария py, содержащий следующие команды. В VisualStudio я установил «Дополнительные параметры сохранения...» на «UTF-8 без подписи». Скрипт просто печатает на экране строку с акцентом, затем импортирует модуль arcpy, затем снова печатает ту же строку. Импорт Arcpy, кажется, изменяет настройку кодирования Python, но я не знаю почему, и я хотел бы восстановить ее правильно, потому что это вызывает проблемы везде в исходном скрипте.


Я проверил папку python «coding» и стер все файлы 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

Исходный тип: type 'unicode'
Исходный текст: Récuperation des données ‹--- Верно< br>
import arcpy
Загруженная кодировка: utf-8

arcpy mess up исходный тип: type 'unicode'
arcpy mess up исходный текст: R'cuperation des donn'es> < strong>‹--- Это неправильно
arcpy перепутал ReEncode с типом cp1252 : type 'str'
arcpy запутался ReEncode с cp1252 text : Récuperation des données> ‹--- Это соответствует оригинальному юникоду


person orange    schedule 22.10.2013    source источник


Ответы (2)


Отвечая на мой вопрос.

От поддержки 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 без подписи.

Надеюсь, это кому-нибудь поможет.

person orange    schedule 12.11.2013

Для тех, кто сомневается, попробуйте что-то вроде следующего (например, в файле .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

person Pär    schedule 04.02.2015