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