Скрипт Python в ArcGIS 10 использует модуль re и возвращает глобальное имя «re» не определено

Я новичок в написании сценариев на Python и в основном использую его в ArcGIS 10. Предполагается, что мой сценарий переформатирует строку в поле CINTP1. Примером может быть «000000100» и возврат «1.00». Я импортировал его в панель инструментов для запуска выбранной записи в таблице «MAPCHAR». Ошибка, которую я продолжаю получать:

: ОШИБКА 000539: Ошибка выполнения выражения: removeLeadingZeros("000000100") : глобальное имя 're' не определено Не удалось выполнить (CalculateField).

Не удалось выполнить (скрипт).

Вот мой сценарий:

import arcpy, re, sys, string, os

MAPCHAR = "MAPCHAR"

CINPT1 = "CINPT1"

expression = "removeLeadingZeros(!CINPT1!)"
codeblock = """def removeLeadingZeros(myValue):
    newValue = re.sub('^0+',"",myValue)

    valueList = list(newValue) #convert newValue to List
    valueList.insert(-2, '.') #insert the '.' characater int the list at the -2 position

    newValue = "".join(valueList) #join back to create the new  updated string

    myvalue = newValue"""

arcpy.CalculateField_management(MAPCHAR, CINPT1, expression, "Python", codeblock)

Любая помощь будет оценена .. спасибо,


person user1714326    schedule 04.10.2012    source источник
comment
Я думаю, вам нужно добавить оператор импорта в вашу строку codeblock..   -  person Rohit Jain    schedule 04.10.2012


Ответы (2)


У вас должны быть операторы импорта в приведенном ниже кодовом блоке. Поэтому добавьте import re в качестве первой строки в кодовом блоке: -

codeblock = """import re
    def removeLeadingZeros(myValue):
        newValue = re.sub('^0+',"",myValue)

        valueList = list(newValue) #convert newValue to List
        valueList.insert(-2, '.') #insert the '.' int the list at the -2 position

        newValue = "".join(valueList) #join back to create the new  updated string

        myvalue = newValue"""
person Rohit Jain    schedule 04.10.2012
comment
Спасибо за быстрый ответ! Я добавил оператор импорта в кодовый блок, но теперь получаю сообщение об ошибке для имени «newValue» не определено. Я думал, что это определяется в кодовом блоке с помощью инструкции re.sub. Опять же, я довольно новичок в этом, спасибо! - person user1714326; 04.10.2012
comment
Хорошо... Я нашел проблему. У меня была опечатка (myvalue = newValue должно быть myValue), но теперь, когда я запускаю скрипт в ArcGIS, он возвращает в поле нулевое значение. - person user1714326; 05.10.2012
comment
Должен ли я возвращать myValue по-другому, прежде чем он будет использоваться в arcpy.CalculateField? - person user1714326; 05.10.2012
comment
@user1714326 user1714326 .. Вы можете напрямую вернуть newValue .. Нет необходимости назначать его myValue .. - person Rohit Jain; 05.10.2012
comment
Извините, я пытался. Там сказано, что для этого требуется репутация 15, и это мой первый раз. Если я поднимусь туда, я вернусь к этой теме и проголосую за вас. - person user1714326; 05.10.2012

Похоже, вы используете codeblock в пространстве имен arcpy. Если в arcpy нет import re, codeblock работать не будет.

кстати, вам не нужно регулярное выражение для удаления начальных нулей - просто преобразуйте в целое число. Классический пример использования гаечного ключа для забивания гвоздя.

person kreativitea    schedule 04.10.2012
comment
Я также добавляю . к струне. Если бы у вас был какой-то намек на более простой способ сделать это, я бы определенно рассмотрел его. Кажется, что начинающий писать скрипты на Python требует много молотков! - person user1714326; 04.10.2012
comment
вы можете вставить . в произвольную точку строки. string[:-2] + "." + string[-2:] вставляет . перед предпоследним символом. - person kreativitea; 04.10.2012