Python заполнить колонку

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
Syllion
Активный участник
Сообщения: 167
Зарегистрирован: 23 сен 2009, 16:09
Репутация: 0

Python заполнить колонку

Сообщение Syllion » 22 авг 2013, 15:47

Нужно:
1. Проверить есть ли колонка, если нет, создать ее
2. Записать туда модицифированное значение из другого поля.

Однако даже чистой воды шаг 2 у меня не работает. В кулькуляторе поля пишу следующее:

Код: Выделить всё

if preview == "":
    !preview!=!cDataFileN!.replace(".img","_preview.jpg")
    !preview!.replace("\"", "")
else:
    return 0
Ругается на неправильный синтаксис. Что делаю не так.

Отдельная строка:
!cDataFileN!.replace(".img","_preview.jpg")

работает нормально.

Мне как минимум нужно ее выполнить и сделать еще один replace по ней. Как это сделать?
!cDataFileN!.replace(".img","_preview.jpg").replace("old","new") -- так же не правильно?

Andrey Zhukov
Гуру
Сообщения: 838
Зарегистрирован: 10 дек 2009, 23:24
Репутация: 169
Ваше звание: старик-гисовик
Откуда: Москва
Контактная информация:

Re: Python заполнить колонку

Сообщение Andrey Zhukov » 22 авг 2013, 16:07

А можно, пожалуйста, полный код того, что вы пишете в CodeBlock? Потому что тот код, что вы скинули, не запустится без определения функции.

Syllion
Активный участник
Сообщения: 167
Зарегистрирован: 23 сен 2009, 16:09
Репутация: 0

Re: Python заполнить колонку

Сообщение Syllion » 22 авг 2013, 16:08

Я его пытался запустить именно так... в каких случаях требуется определение функции?

Andrey Zhukov
Гуру
Сообщения: 838
Зарегистрирован: 10 дек 2009, 23:24
Репутация: 169
Ваше звание: старик-гисовик
Откуда: Москва
Контактная информация:

Re: Python заполнить колонку

Сообщение Andrey Zhukov » 22 авг 2013, 17:07

В CalculateField надо запускать функцию. Всю логику надо определять в CodeBlock (Pre-Logic Script Code) в функцию, которую потом и вызывать. Описано в справке.
Соответственно, у вас будет нечто вроде:

Код: Выделить всё

def previewCheck(preview,cDataFile):
    if preview == "":
        return cDataFileN.replace(".img","_preview.jpg").replace("\"", "")
    else:
        return 0
А в самом поле вызова функции пишете previewCheck(!preview!,!cDataFileN!). !cDataFileN!.replace(".img","_preview.jpg").replace("old","new") - так можно. Если боитесь присутствия двойных кавычек в строке, используйте одинарные.

Syllion
Активный участник
Сообщения: 167
Зарегистрирован: 23 сен 2009, 16:09
Репутация: 0

Re: Python заполнить колонку

Сообщение Syllion » 26 авг 2013, 10:43

Полный вариант не работает почему-то.

Получилось только с:

Код: Выделить всё

!cDataFileN!.replace(".img","_preview.jpg").replace("\"", "")
Последний раз редактировалось Syllion 26 авг 2013, 11:00, всего редактировалось 1 раз.

Andrey Zhukov
Гуру
Сообщения: 838
Зарегистрирован: 10 дек 2009, 23:24
Репутация: 169
Ваше звание: старик-гисовик
Откуда: Москва
Контактная информация:

Re: Python заполнить колонку

Сообщение Andrey Zhukov » 26 авг 2013, 10:59

Код: Выделить всё

!cDataFileN!.replace(".img","_preview.jpg").replace("\\"", "")
А зачем там двойной слэш? Такой синтаксис справедливо отваливается с "EOL while scanning string literal".

А в своем примере, каюсь, косякнул. Скорее всего, у вас выпадал с ошибкой "global name 'cDataFileN' is not defined".
Так правильно:

Код: Выделить всё

def previewCheck(preview,cDataFile):
    if preview == "":
        return cDataFile.replace(".img","_preview.jpg").replace("\"", "")
    else:
        return 0

Syllion
Активный участник
Сообщения: 167
Зарегистрирован: 23 сен 2009, 16:09
Репутация: 0

Re: Python заполнить колонку

Сообщение Syllion » 26 авг 2013, 11:01

Если что сори, за секунду до вашего ответа сообщение исправил. Сейчас все проверю.

Код: Выделить всё

def previewCheck(preview,cDataFile):
    if preview == "":
        return cDataFileN.replace(".img","_preview.jpg").replace("\"", "")
    else:
        return 0
почему-то возвращает ноль.

Работает только:

Код: Выделить всё

!cDataFileN!.replace(".img","_preview.jpg").replace("\"", "")
P.S. Вы в своем коде букву на конце потеряли в одном месте cDataFileN
Последний раз редактировалось Syllion 26 авг 2013, 11:21, всего редактировалось 1 раз.

Andrey Zhukov
Гуру
Сообщения: 838
Зарегистрирован: 10 дек 2009, 23:24
Репутация: 169
Ваше звание: старик-гисовик
Откуда: Москва
Контактная информация:

Re: Python заполнить колонку

Сообщение Andrey Zhukov » 26 авг 2013, 11:19

Дык может, у вас preview Null, а не ""?

Syllion
Активный участник
Сообщения: 167
Зарегистрирован: 23 сен 2009, 16:09
Репутация: 0

Re: Python заполнить колонку

Сообщение Syllion » 26 авг 2013, 11:24

Все спасибо разобрался!
Стал проверять код еще раз, оказалось еще в одном месте имя столбца было без N указано.

Кстати, "" это разве не Null?

Andrey Zhukov
Гуру
Сообщения: 838
Зарегистрирован: 10 дек 2009, 23:24
Репутация: 169
Ваше звание: старик-гисовик
Откуда: Москва
Контактная информация:

Re: Python заполнить колонку

Сообщение Andrey Zhukov » 26 авг 2013, 11:30

Нет. Если у вас есть пустые строки, а есть Null, то надо так:

Код: Выделить всё

def previewCheck(preview,cDataFile):
    if preview == "" or preview ==None:
        return cDataFile.replace(".img","_preview.jpg").replace("\"", "")
    else:
        return 0

Syllion
Активный участник
Сообщения: 167
Зарегистрирован: 23 сен 2009, 16:09
Репутация: 0

Re: Python заполнить колонку

Сообщение Syllion » 26 авг 2013, 14:30

Так. С калькулятором поля вроде все заработало. Пока чтобы было проще пробую самый простой вариант. Я сделал модель и экспортировал ее как Python скрипт.

Код: Выделить всё

arcpy.CalculateField_management(input_based_on_raster, "preview", "!cDataFileN!.replace(\".img\",\"_preview.jpg\").replace(\"\\\"\", \"\")", "PYTHON_9.3", "")
Оно делает то что нужно, однако мне нужно к строке:

Код: Выделить всё

"!cDataFileN!.replace(\".img\",\"_preview.jpg\").replace(\"\\\"\", \"\")"
прибавить определенный путь, который у меня идет в скрипте выше.
хотел сделать

Код: Выделить всё

myvar + "!cDataFileN!.replace(\".img\",\"_preview.jpg\").replace(\"\\\"\", \"\")"

но что-то не заработало. Как мне при калькульяции поля прибавить нужную мне строку?

Andrey Zhukov
Гуру
Сообщения: 838
Зарегистрирован: 10 дек 2009, 23:24
Репутация: 169
Ваше звание: старик-гисовик
Откуда: Москва
Контактная информация:

Re: Python заполнить колонку

Сообщение Andrey Zhukov » 26 авг 2013, 14:50

Потому что CalculateField_management - это функция, которая принимает выражение как аргумент. Соответственно, нужно ей все это целиком в аргумент и запихнуть. В общем, я бы посоветовал начать изучать чистый arcpy и курсоры, там это будет значительно проще.

Syllion
Активный участник
Сообщения: 167
Зарегистрирован: 23 сен 2009, 16:09
Репутация: 0

Re: Python заполнить колонку

Сообщение Syllion » 26 авг 2013, 15:22

А не могли бы подсказать решение. Просто это последний шаг который нужно выполнить.

Про чистый Arcpy книги тоже есть?

Andrey Zhukov
Гуру
Сообщения: 838
Зарегистрирован: 10 дек 2009, 23:24
Репутация: 169
Ваше звание: старик-гисовик
Откуда: Москва
Контактная информация:

Re: Python заполнить колонку

Сообщение Andrey Zhukov » 26 авг 2013, 15:52

Справка все знает.

Для калькулятора поля придется залезть в format.
А так будет нечто вроде:

Код: Выделить всё

arcpy.CalculateField_management(input_based_on_raster, "preview","{}{}".format(myvar, !cDataFileN!.replace(".img","_preview.jpg").replace("\"", "")), "PYTHON_9.3", "")
[/s]
Увы, все это не будет работать, как в итоге выяснилось.
Последний раз редактировалось Andrey Zhukov 26 авг 2013, 17:01, всего редактировалось 2 раза.

Syllion
Активный участник
Сообщения: 167
Зарегистрирован: 23 сен 2009, 16:09
Репутация: 0

Re: Python заполнить колонку

Сообщение Syllion » 26 авг 2013, 16:17

Ругается на ошибку...
Безымянный.png
Безымянный.png (8.19 КБ) 11381 просмотр
На всякий случай вот полная версия кода:

Код: Выделить всё

import arcpy

input_based_on_raster = "C:\\1\\2\\fr_kv1_05002_05000_01_3np2_08_t_pss1_034412_180613_raster_reclass.shp"

myvar = "C:\\somefolder\\"

arcpy.CalculateField_management(input_based_on_raster, "preview","{}{}".format(myvar, !cDataFileN!.replace(".img","_preview.jpg").replace("\"", "")), "PYTHON_9.3", "")

Ответить

Вернуться в «ArcGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 9 гостей