Страница 1 из 2
Python заполнить колонку
Добавлено: 22 авг 2013, 15:47
Syllion
Нужно:
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") -- так же не правильно?
Re: Python заполнить колонку
Добавлено: 22 авг 2013, 16:07
Andrey Zhukov
А можно, пожалуйста, полный код того, что вы пишете в CodeBlock? Потому что тот код, что вы скинули, не запустится без определения функции.
Re: Python заполнить колонку
Добавлено: 22 авг 2013, 16:08
Syllion
Я его пытался запустить именно так... в каких случаях требуется определение функции?
Re: Python заполнить колонку
Добавлено: 22 авг 2013, 17:07
Andrey Zhukov
В 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") - так можно. Если боитесь присутствия двойных кавычек в строке, используйте одинарные.
Re: Python заполнить колонку
Добавлено: 26 авг 2013, 10:43
Syllion
Полный вариант не работает почему-то.
Получилось только с:
Код: Выделить всё
!cDataFileN!.replace(".img","_preview.jpg").replace("\"", "")
Re: Python заполнить колонку
Добавлено: 26 авг 2013, 10:59
Andrey Zhukov
Код: Выделить всё
!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
Re: Python заполнить колонку
Добавлено: 26 авг 2013, 11:01
Syllion
Если что сори, за секунду до вашего ответа сообщение исправил. Сейчас все проверю.
Код: Выделить всё
def previewCheck(preview,cDataFile):
if preview == "":
return cDataFileN.replace(".img","_preview.jpg").replace("\"", "")
else:
return 0
почему-то возвращает ноль.
Работает только:
Код: Выделить всё
!cDataFileN!.replace(".img","_preview.jpg").replace("\"", "")
P.S. Вы в своем коде букву на конце потеряли в одном месте cDataFile
N
Re: Python заполнить колонку
Добавлено: 26 авг 2013, 11:19
Andrey Zhukov
Дык может, у вас preview Null, а не ""?
Re: Python заполнить колонку
Добавлено: 26 авг 2013, 11:24
Syllion
Все спасибо разобрался!
Стал проверять код еще раз, оказалось еще в одном месте имя столбца было без N указано.
Кстати, "" это разве не Null?
Re: Python заполнить колонку
Добавлено: 26 авг 2013, 11:30
Andrey Zhukov
Нет. Если у вас есть пустые строки, а есть Null, то надо так:
Код: Выделить всё
def previewCheck(preview,cDataFile):
if preview == "" or preview ==None:
return cDataFile.replace(".img","_preview.jpg").replace("\"", "")
else:
return 0
Re: Python заполнить колонку
Добавлено: 26 авг 2013, 14:30
Syllion
Так. С калькулятором поля вроде все заработало. Пока чтобы было проще пробую самый простой вариант. Я сделал модель и экспортировал ее как 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(\"\\\"\", \"\")"
но что-то не заработало. Как мне при калькульяции поля прибавить нужную мне строку?
Re: Python заполнить колонку
Добавлено: 26 авг 2013, 14:50
Andrey Zhukov
Потому что CalculateField_management - это функция, которая принимает выражение как аргумент. Соответственно, нужно ей все это целиком в аргумент и запихнуть. В общем, я бы посоветовал начать изучать чистый arcpy и курсоры, там это будет значительно проще.
Re: Python заполнить колонку
Добавлено: 26 авг 2013, 15:22
Syllion
А не могли бы подсказать решение. Просто это последний шаг который нужно выполнить.
Про чистый Arcpy книги тоже есть?
Re: Python заполнить колонку
Добавлено: 26 авг 2013, 15:52
Andrey Zhukov
Справка все знает.
Для калькулятора поля придется залезть в format.
А так будет нечто вроде:
Код: Выделить всё
arcpy.CalculateField_management(input_based_on_raster, "preview","{}{}".format(myvar, !cDataFileN!.replace(".img","_preview.jpg").replace("\"", "")), "PYTHON_9.3", "")
[/s]
Увы, все это не будет работать, как в итоге выяснилось.
Re: Python заполнить колонку
Добавлено: 26 авг 2013, 16:17
Syllion
Ругается на ошибку...

- Безымянный.png (8.19 КБ) 12717 просмотров
На всякий случай вот полная версия кода:
Код: Выделить всё
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", "")