Перейти к содержимому

Spyder как закомментировать несколько строк

  • автор:

Многострочные комментарии в Python

В Python, для однострочных комментариев используется символ # . Но если нужно закомментировать большой блок кода, то приходится приписывать # в начале каждой строки. Это очень неудобно при отладке. Есть ли какая-то возможность использовать многострочные комментарии (аналог /* . */ из Си) в Python? UPD: Знаю, что различные IDE позволяют делать такие вещи автоматически, но хотелось бы более элегантного решения, не зависящего от средства редактирования кода и различных утилит.

Отслеживать
Dmitriy Simushev
задан 12 окт 2015 в 11:48
Dmitriy Simushev Dmitriy Simushev
17.9k 5 5 золотых знаков 48 48 серебряных знаков 85 85 бронзовых знаков
Как это сделать в VIM штатными средствами: stackoverflow.com/a/2561497
12 окт 2015 в 19:50

Мой вопрос сводится скорее к «как использовать многострочные комментарии в языке, где нет многострочных комментариев», а не к «как использовать редакторы кода для автоматического создания пачки однострочных комментариев»

13 окт 2015 в 11:16

5 ответов 5

Сортировка: Сброс на вариант по умолчанию

Насколько мне известно, отдельного синтаксиса для многострочных комментариев в Python нет. В тоже время, можно использовать строковые литералы, заключенные в тройные апострофы, например так:

''' Это строковый литерал. Но здесь он используется как многострочный комментарий ''' 

Строковые литералы, заключенные в тройные кавычки, могут содержать:

  • кавычки ( » )
  • апострофы ( ‘ )
  • docstring комментарии ( «»»func desc»»» )
  • переводы строк

В тоже время, стоит помнить, что такой строковый литерал не должен содержать внутри символов »’ . Это требование аналогично запрету на последовательность символов */ внутри многострочного комментария Си.

Кстати, этот же хак, предлагает использовать создатель языка Python в одном из своих твитов.

В тоже время, как верно отметил @jfs, руководство по стилю кода (pep-8) рекомендует использовать # для блочных комментариев.

Отслеживать
ответ дан 12 окт 2015 в 11:48
Dmitriy Simushev Dmitriy Simushev
17.9k 5 5 золотых знаков 48 48 серебряных знаков 85 85 бронзовых знаков
Действительно, это способ описан во всех (или почти всех) книгах о Python
12 окт 2015 в 12:11

Руководство по стилю кода (pep-8) рекомендует использовать # для блочных комментариев.

Но если нужно закомментировать большой блок кода, то приходится приписывать # в начале каждой строки. Это очень неудобно при отладке.

Один из явных признаков неумелого программирования — это наличие закомментированных фрагментов кода. Используйте систему контроля версий и/или ваше IDE, чтобы временно убрать/закомментировать код при отладке. Настройте ваше окружение, чтобы вы могли это делать не задумываясь, нажимая пару клавиш.

Знаю, что различные IDE позволяют делать такие вещи автоматически, но хотелось бы более элегантного решения, не зависящего от средства редактирования кода и различных утилит.

Закомментированный код не должен добавляться в систему контроля версий, поэтому для временных изменений, которые не переживут одну сессию редактирования кода, один клавишный аккорд (например, M-; в Emacs), как правило, достаточен, чтобы закомментировать/раскомментировать кусок кода.

«»»multiline string literal»»» не является многострочным комментарием в Питоне. Это просто строковая константа, которая позволяет использовать буквальные символы новой строки без экранирования (такого как \n ). Часто используется для описаний модулей, классов, функций/методов прямо в коде:

>>> def f(): . """abc""" . >>> f.__doc__ 'abc' 

Попытка использовать «»»»»» в качестве многострочного комментария сломается на первой docstring, даже если бы не было других более подходящий решений для данной задачи.

Функции для работы со строками

Строка считается непустой, если содержит хотя бы один байт, пусть даже это пробел или нулевой байт.

Функция также поддерживает работу с типами Array и UUID.

Параметры

  • x — Входная строка. String.

Возвращаемое значение

  • Возвращает 1 для пустой строки и 0 — для непустой строки.

Пример

SELECT empty('text'); 
┌─empty('text')─┐ │ 0 │ └───────────────┘ 

notEmpty​

Проверяет, является ли входная строка непустой.

Синтаксис

notEmpty(x) 

Строка считается непустой, если содержит хотя бы один байт, пусть даже это пробел или нулевой байт.

Функция также поддерживает работу с типами Array и UUID.

Параметры

  • x — Входная строка. String.

Возвращаемое значение

  • Возвращает 1 для непустой строки и 0 — для пустой строки.

Пример

SELECT notEmpty('text'); 
┌─notEmpty('text')─┐ │ 1 │ └──────────────────┘ 

length​

Возвращает длину строки в байтах (не символах, не кодовых точках). Тип результата — UInt64. Функция также работает для массивов.

lengthUTF8​

Возвращает длину строки в кодовых точках Unicode (не символах), при допущении, что строка содержит набор байтов, являющийся текстом в кодировке UTF-8. Если допущение не выполнено, то возвращает какой-нибудь результат (не кидает исключение). Тип результата — UInt64.

char_length, CHAR_LENGTH​

Возвращает длину строки в кодовых точках Unicode (не символах), при допущении, что строка содержит набор байтов, являющийся текстом в кодировке UTF-8. Если допущение не выполнено, возвращает какой-нибудь результат (не кидает исключение). Тип результата — UInt64.

character_length, CHARACTER_LENGTH​

Возвращает длину строки в кодовых точках Unicode (не символах), при допущении, что строка содержит набор байтов, являющийся текстом в кодировке UTF-8. Если допущение не выполнено, возвращает какой-нибудь результат (не кидает исключение). Тип результата — UInt64.

leftPad​

Дополняет текущую строку слева пробелами или указанной строкой (несколько раз, если необходимо), пока результирующая строка не достигнет заданной длины. Соответствует MySQL функции LPAD .

Синтаксис

leftPad('string', 'length'[, 'pad_string']) 

Параметры

  • string — входная строка, которую необходимо дополнить. String.
  • length — длина результирующей строки. UInt. Если указанное значение меньше, чем длина входной строки, то входная строка возвращается как есть.
  • pad_string — строка, используемая для дополнения входной строки. String. Необязательный параметр. Если не указано, то входная строка дополняется пробелами.

Возвращаемое значение

  • Результирующая строка заданной длины.

Пример

SELECT leftPad('abc', 7, '*'), leftPad('def', 7); 
┌─leftPad('abc', 7, '*')─┬─leftPad('def', 7)─┐ │ ****abc │ def │ └────────────────────────┴───────────────────┘ 

leftPadUTF8​

Дополняет текущую строку слева пробелами или указанной строкой (несколько раз, если необходимо), пока результирующая строка не достигнет заданной длины. Соответствует MySQL функции LPAD . В отличие от функции leftPad, измеряет длину строки не в байтах, а в кодовых точках Unicode.

Синтаксис

leftPadUTF8('string','length'[, 'pad_string']) 

Параметры

  • string — входная строка, которую необходимо дополнить. String.
  • length — длина результирующей строки. UInt. Если указанное значение меньше, чем длина входной строки, то входная строка возвращается как есть.
  • pad_string — строка, используемая для дополнения входной строки. String. Необязательный параметр. Если не указано, то входная строка дополняется пробелами.

Возвращаемое значение

  • Результирующая строка заданной длины.

Пример

SELECT leftPadUTF8('абвг', 7, '*'), leftPadUTF8('дежз', 7); 
┌─leftPadUTF8('абвг', 7, '*')─┬─leftPadUTF8('дежз', 7)─┐ │ ***абвг │ дежз │ └─────────────────────────────┴────────────────────────┘ 

rightPad​

Дополняет текущую строку справа пробелами или указанной строкой (несколько раз, если необходимо), пока результирующая строка не достигнет заданной длины. Соответствует MySQL функции RPAD .

Синтаксис

rightPad('string', 'length'[, 'pad_string']) 

Параметры

  • string — входная строка, которую необходимо дополнить. String.
  • length — длина результирующей строки. UInt. Если указанное значение меньше, чем длина входной строки, то входная строка возвращается как есть.
  • pad_string — строка, используемая для дополнения входной строки. String. Необязательный параметр. Если не указано, то входная строка дополняется пробелами.

Возвращаемое значение

  • Результирующая строка заданной длины.

Пример

SELECT rightPad('abc', 7, '*'), rightPad('abc', 7); 
┌─rightPad('abc', 7, '*')─┬─rightPad('abc', 7)─┐ │ abc**** │ abc │ └─────────────────────────┴────────────────────┘ 

rightPadUTF8​

Дополняет текущую строку слева пробелами или указанной строкой (несколько раз, если необходимо), пока результирующая строка не достигнет заданной длины. Соответствует MySQL функции RPAD . В отличие от функции rightPad, измеряет длину строки не в байтах, а в кодовых точках Unicode.

Синтаксис

rightPadUTF8('string','length'[, 'pad_string']) 

Параметры

  • string — входная строка, которую необходимо дополнить. String.
  • length — длина результирующей строки. UInt. Если указанное значение меньше, чем длина входной строки, то входная строка возвращается как есть.
  • pad_string — строка, используемая для дополнения входной строки. String. Необязательный параметр. Если не указано, то входная строка дополняется пробелами.

Возвращаемое значение

  • Результирующая строка заданной длины.

Пример

SELECT rightPadUTF8('абвг', 7, '*'), rightPadUTF8('абвг', 7); 
┌─rightPadUTF8('абвг', 7, '*')─┬─rightPadUTF8('абвг', 7)─┐ │ абвг*** │ абвг │ └──────────────────────────────┴─────────────────────────┘ 

lower, lcase​

Переводит ASCII-символы латиницы в строке в нижний регистр.

upper, ucase​

Переводит ASCII-символы латиницы в строке в верхний регистр.

lowerUTF8​

Переводит строку в нижний регистр, при допущении, что строка содержит набор байтов, представляющий текст в кодировке UTF-8. Не учитывает язык. То есть, для турецкого языка, результат может быть не совсем верным. Если длина UTF-8 последовательности байтов различна для верхнего и нижнего регистра кодовой точки, то для этой кодовой точки результат работы может быть некорректным. Если строка содержит набор байтов, не являющийся UTF-8, то поведение не определено.

upperUTF8​

Переводит строку в верхний регистр, при допущении, что строка содержит набор байтов, представляющий текст в кодировке UTF-8. Не учитывает язык. То есть, для турецкого языка, результат может быть не совсем верным. Если длина UTF-8 последовательности байтов различна для верхнего и нижнего регистра кодовой точки, то для этой кодовой точки, результат работы может быть некорректным. Если строка содержит набор байтов, не являющийся UTF-8, то поведение не определено.

isValidUTF8​

Возвращает 1, если набор байтов является корректным в кодировке UTF-8, 0 иначе.

toValidUTF8​

Заменяет некорректные символы UTF-8 на символ � (U+FFFD). Все идущие подряд некорректные символы схлопываются в один заменяющий символ.

toValidUTF8(input_string) 

Аргументы

  • input_string — произвольный набор байтов, представленный как объект типа String.

Возвращаемое значение: Корректная строка UTF-8.

Пример

SELECT toValidUTF8('\x61\xF0\x80\x80\x80b'); 
┌─toValidUTF8('a����b')─┐ │ a�b │ └───────────────────────┘ 

repeat​

Повторяет строку определенное количество раз и объединяет повторяемые значения в одну строку.

Синтаксис

repeat(s, n) 

Аргументы

  • s — строка для повторения. String.
  • n — количество повторов. UInt.

Возвращаемое значение

Строка, состоящая из повторений n раз исходной строки s . Если n \< 1, то функция вернет пустую строку.

Пример

SELECT repeat('abc', 10); 
┌─repeat('abc', 10)──────────────┐ │ abcabcabcabcabcabcabcabcabcabc │ └────────────────────────────────┘ 

reverse​

Разворачивает строку (как последовательность байтов).

reverseUTF8​

Разворачивает последовательность кодовых точек Unicode, при допущении, что строка содержит набор байтов, представляющий текст в кодировке UTF-8. Иначе — что-то делает (не кидает исключение).

format(pattern, s0, s1, …)​

Форматирует константный шаблон со строками, перечисленными в аргументах. pattern — упрощенная версия шаблона в языке Python. Шаблон содержит «заменяющие поля», которые окружены фигурными скобками <> . Всё, что не содержится в скобках, интерпретируется как обычный текст и просто копируется. Если нужно использовать символ фигурной скобки, можно экранировать двойной скобкой > или >’ >> . Имя полей могут быть числами (нумерация с нуля) или пустыми (тогда они интерпретируются как последовательные числа).

SELECT format('  ', 'World', 'Hello') 
┌─format('  ', 'World', 'Hello')─┐ │ Hello World Hello │ └─────────────────────────────────────────┘ 
SELECT format('<> <>', 'Hello', 'World') 
┌─format('<> <>', 'Hello', 'World')─┐ │ Hello World │ └───────────────────────────────────┘ 

concat​

Склеивает строки, переданные в аргументы, в одну строку без разделителей.

Cинтаксис

concat(s1, s2, ...) 

Аргументы

Значения типа String или FixedString.

Возвращаемое значение

Возвращает строку, полученную в результате склейки аргументов.

Если любой из аргументов имеет значение NULL , concat возвращает значение NULL .

Пример

SELECT concat('Hello, ', 'World!'); 
┌─concat('Hello, ', 'World!')─┐ │ Hello, World! │ └─────────────────────────────┘ 

concatAssumeInjective​

Аналогична concat. Разница заключается в том, что вам нужно убедиться, что concat(s1, s2, . ) → sn является инъективным, так как это предположение будет использоваться для оптимизации GROUP BY.

Функция называется «инъективной», если она возвращает разные значения для разных аргументов. Или, иными словами, функция никогда не выдаёт одно и то же значение, если аргументы разные.

Синтаксис

concatAssumeInjective(s1, s2, ...) 

Аргументы

Значения типа String или FixedString.

Возвращаемые значения

Возвращает строку, полученную в результате объединения аргументов.

Если любой из аргументов имеет значение NULL , concatAssumeInjective возвращает значение NULL .

Пример

CREATE TABLE key_val(`key1` String, `key2` String, `value` UInt32) ENGINE = TinyLog INSERT INTO key_val VALUES ('Hello, ','World',1)('Hello, ','World',2)('Hello, ','World!',3)('Hello',', World!',2) SELECT * from key_val 
┌─key1────┬─key2─────┬─value─┐ │ Hello, │ World │ 1 │ │ Hello, │ World │ 2 │ │ Hello, │ World! │ 3 │ │ Hello │ , World! │ 2 │ └─────────┴──────────┴───────┘ 
SELECT concat(key1, key2), sum(value) FROM key_val GROUP BY (key1, key2); 
┌─concat(key1, key2)─┬─sum(value)─┐ │ Hello, World! │ 3 │ │ Hello, World! │ 2 │ │ Hello, World │ 3 │ └────────────────────┴────────────┘ 

substring(s, offset, length), mid(s, offset, length), substr(s, offset, length)​

Возвращает подстроку, начиная с байта по индексу offset, длины length байт. Индексация символов — начиная с единицы (как в стандартном SQL). Аргументы offset и length должны быть константами.

substringUTF8(s, offset, length)​

Так же, как substring, но для кодовых точек Unicode. Работает при допущении, что строка содержит набор байтов, представляющий текст в кодировке UTF-8. Если допущение не выполнено, то возвращает какой-нибудь результат (не кидает исключение).

appendTrailingCharIfAbsent(s, c)​

Если строка s непустая и не содержит символ c на конце, то добавляет символ c в конец.

convertCharset(s, from, to)​

Возвращает сконвертированную из кодировки from в кодировку to строку s.

base58Encode(plaintext), base58Decode(encoded_text)​

Принимает на вход строку или колонку строк и кодирует/раскодирует их с помощью схемы кодирования Base58 с использованием стандартного алфавита Bitcoin.

Синтаксис

base58Encode(decoded) base58Decode(encoded) 

Аргументы

  • decoded — Колонка или строка типа String.
  • encoded — Колонка или строка типа String. Если входная строка не является корректным кодом для какой-либо другой строки, возникнет исключение.

Возвращаемое значение

  • Строка, содержащая раскодированный/закодированный первый аргумент.

Пример:

SELECT base58Encode('Encoded'); SELECT base58Decode('3dc8KtHrwM'); 
┌─base58Encode('Encoded')─┐ │ 3dc8KtHrwM │ └─────────────────────────┘ ┌─base58Decode('3dc8KtHrwM')─┐ │ Encoded │ └────────────────────────────┘ 

base64Encode(s)​

Производит кодирование строки s в base64-представление.

base64Decode(s)​

Декодирует base64-представление s в исходную строку. При невозможности декодирования выбрасывает исключение

tryBase64Decode(s)​

Функционал аналогичен base64Decode, но при невозможности декодирования возвращает пустую строку.

endsWith(s, suffix)​

Возвращает 1, если строка завершается указанным суффиксом, и 0 в противном случае.

startsWith(str, prefix)​

Возвращает 1, если строка начинается указанным префиксом, в противном случае 0.

SELECT startsWith('Spider-Man', 'Spi'); 

Возвращаемые значения

  • 1, если строка начинается указанным префиксом.
  • 0, если строка не начинается указанным префиксом.

Пример

SELECT startsWith('Hello, world!', 'He'); 
┌─startsWith('Hello, world!', 'He')─┐ │ 1 │ └───────────────────────────────────┘ 

trim​

Удаляет все указанные символы с начала или окончания строки. По умолчанию удаляет все последовательные вхождения обычных пробелов (32 символ ASCII) с обоих концов строки.

Синтаксис

trim([[LEADING|TRAILING|BOTH] trim_character FROM] input_string) 

Аргументы

  • trim_character — один или несколько символов, подлежащие удалению. String.
  • input_string — строка для обрезки. String.

Возвращаемое значение

Исходную строку после обрезки с левого и (или) правого концов строки.

Пример

SELECT trim(BOTH ' ()' FROM '( Hello, world! )'); 
┌─trim(BOTH ' ()' FROM '( Hello, world! )')─┐ │ Hello, world! │ └───────────────────────────────────────────────┘ 

trimLeft​

Удаляет все последовательные вхождения обычных пробелов (32 символ ASCII) с левого конца строки. Не удаляет другие виды пробелов (табуляция, пробел без разрыва и т. д.).

Синтаксис

trimLeft(input_string) 

Аргументы

  • input_string — строка для обрезки. String.

Возвращаемое значение

Исходную строку без общих пробельных символов слева.

Пример

SELECT trimLeft(' Hello, world! '); 
┌─trimLeft(' Hello, world! ')─┐ │ Hello, world! │ └─────────────────────────────────────┘ 

trimRight​

Удаляет все последовательные вхождения обычных пробелов (32 символ ASCII) с правого конца строки. Не удаляет другие виды пробелов (табуляция, пробел без разрыва и т. д.).

Синтаксис

trimRight(input_string) 

Аргументы

  • input_string — строка для обрезки. String.

Возвращаемое значение

Исходную строку без общих пробельных символов справа.

Пример

SELECT trimRight(' Hello, world! '); 
┌─trimRight(' Hello, world! ')─┐ │ Hello, world! │ └──────────────────────────────────────┘ 

trimBoth​

Удаляет все последовательные вхождения обычных пробелов (32 символ ASCII) с обоих концов строки. Не удаляет другие виды пробелов (табуляция, пробел без разрыва и т. д.).

Синтаксис

trimBoth(input_string) 

Аргументы

  • input_string — строка для обрезки. String.

Возвращаемое значение

Исходную строку без общих пробельных символов с обоих концов строки.

Пример

SELECT trimBoth(' Hello, world! '); 
┌─trimBoth(' Hello, world! ')─┐ │ Hello, world! │ └─────────────────────────────────────┘ 

CRC32(s)​

Возвращает чексумму CRC32 данной строки, используется CRC-32-IEEE 802.3 многочлен и начальным значением 0xffffffff (т.к. используется реализация из zlib).

Тип результата — UInt32.

CRC32IEEE(s)​

Возвращает чексумму CRC32 данной строки, используется CRC-32-IEEE 802.3 многочлен.

Тип результата — UInt32.

CRC64(s)​

Возвращает чексумму CRC64 данной строки, используется CRC-64-ECMA многочлен.

Тип результата — UInt64.

normalizeQuery​

Заменяет литералы, последовательности литералов и сложные псевдонимы заполнителями.

Синтаксис

normalizeQuery(x) 

Аргументы

  • x — последовательность символов. String.

Возвращаемое значение

  • Последовательность символов с заполнителями.

Пример

SELECT normalizeQuery('[1, 2, 3, x]') AS query; 
┌─query────┐ │ [. x] │ └──────────┘ 

normalizedQueryHash​

Возвращает идентичные 64-битные хэш — суммы без значений литералов для аналогичных запросов. Это помогает анализировать журнал запросов.

Синтаксис

normalizedQueryHash(x) 

Аргументы

  • x — последовательность символов. String.

Возвращаемое значение

Пример

SELECT normalizedQueryHash('SELECT 1 AS `xyz`') != normalizedQueryHash('SELECT 1 AS `abc`') AS res; 
┌─res─┐ │ 1 │ └─────┘ 

normalizeUTF8NFC​

Преобразует строку в нормализованную форму NFC, предполагая, что строка содержит набор байтов, составляющих текст в кодировке UTF-8.

Синтаксис

normalizeUTF8NFC(words) 

Аргументы

  • words — входная строка, которая содержит набор байтов, составляющих текст в кодировке UTF-8. String.

Возвращаемое значение

  • Строка, преобразованная в нормализированную форму NFC.

Пример

SELECT length('â'), normalizeUTF8NFC('â') AS nfc, length(nfc) AS nfc_len; 
┌─length('â')─┬─nfc─┬─nfc_len─┐ │ 2 │ â │ 2 │ └─────────────┴─────┴─────────┘ 

normalizeUTF8NFD​

Преобразует строку в нормализованную форму NFD, предполагая, что строка содержит набор байтов, составляющих текст в кодировке UTF-8.

Синтаксис

normalizeUTF8NFD(words) 

Аргументы

  • words — входная строка, которая содержит набор байтов, составляющих текст в кодировке UTF-8. String.

Возвращаемое значение

  • Строка, преобразованная в нормализированную форму NFD.

Пример

SELECT length('â'), normalizeUTF8NFD('â') AS nfd, length(nfd) AS nfd_len; 
┌─length('â')─┬─nfd─┬─nfd_len─┐ │ 2 │ â │ 3 │ └─────────────┴─────┴─────────┘ 

normalizeUTF8NFKC​

Преобразует строку в нормализованную форму NFKC, предполагая, что строка содержит набор байтов, составляющих текст в кодировке UTF-8.

Синтаксис

normalizeUTF8NFKC(words) 

Аргументы

  • words — входная строка, которая содержит набор байтов, составляющих текст в кодировке UTF-8. String.

Возвращаемое значение

  • Строка, преобразованная в нормализированную форму NFKC.

Пример

SELECT length('â'), normalizeUTF8NFKC('â') AS nfkc, length(nfkc) AS nfkc_len; 
┌─length('â')─┬─nfkc─┬─nfkc_len─┐ │ 2 │ â │ 2 │ └─────────────┴──────┴──────────┘ 

normalizeUTF8NFKD​

Преобразует строку в нормализованную форму NFKD, предполагая, что строка содержит набор байтов, составляющих текст в кодировке UTF-8.

Синтаксис

normalizeUTF8NFKD(words) 

Аргументы

  • words — входная строка, которая содержит набор байтов, составляющих текст в кодировке UTF-8. String.

Возвращаемое значение

  • Строка, преобразованная в нормализированную форму NFKD.

Пример

SELECT length('â'), normalizeUTF8NFKD('â') AS nfkd, length(nfkd) AS nfkd_len; 
┌─length('â')─┬─nfkd─┬─nfkd_len─┐ │ 2 │ â │ 3 │ └─────────────┴──────┴──────────┘ 

encodeXMLComponent​

Экранирует символы для размещения строки в текстовом узле или атрибуте XML.

Экранируются символы, которые в формате XML являются зарезервированными (служебными): < , & , >, » , ‘ .

Синтаксис

encodeXMLComponent(x) 

Аргументы

  • x — последовательность символов. String.

Возвращаемое значение

  • Строка, в которой зарезервированные символы экранированы.

Пример

SELECT encodeXMLComponent('Hello, "world"!'); SELECT encodeXMLComponent(''); SELECT encodeXMLComponent('&clickhouse'); SELECT encodeXMLComponent('\'foo\''); 
Hello, "world"! <123> &clickhouse 'foo' 

decodeXMLComponent​

Заменяет символами предопределенные мнемоники XML: " & ' > < Также эта функция заменяет числовые ссылки соответствующими символами юникод. Поддерживаются десятичная (например, ✓ ) и шестнадцатеричная ( ✓ ) формы.

Синтаксис

decodeXMLComponent(x) 

Аргументы

  • x — последовательность символов. String.

Возвращаемое значение

  • Строка с произведенными заменами.

Пример

SELECT decodeXMLComponent(''foo''); SELECT decodeXMLComponent('< Σ >'); 

Смотрите также

extractTextFromHTML​

Функция для извлечения текста из HTML или XHTML. Она не соответствует всем HTML, XML или XHTML стандартам на 100%, но ее реализация достаточно точная и быстрая. Правила обработки следующие:

  1. Комментарии удаляются. Пример: . Комментарий должен оканчиваться символами —> . Вложенные комментарии недопустимы. Примечание: конструкции наподобие и не являются допустимыми комментариями в HTML, но они будут удалены согласно другим правилам.
  2. Содержимое CDATA вставляется дословно. Примечание: формат CDATA специфичен для XML/XHTML. Но он обрабатывается всегда по принципу «наилучшего возможного результата».
  3. Элементы script и style удаляются вместе со всем содержимым. Примечание: предполагается, что закрывающий тег не может появиться внутри содержимого. Например, в JS строковый литерал должен быть экранирован как «» . Примечание: комментарии и CDATA возможны внутри script или style — тогда закрывающие теги не ищутся внутри CDATA. Пример: ]]> . Но они ищутся внутри комментариев. Иногда возникают сложные случаи: Примечание: script и style могут быть названиями пространств имен XML — тогда они не обрабатываются как обычные элементы script или style . Пример: Hello . Примечание: пробелы возможны после имени закрывающего тега: , но не перед ним: < / script>.
  4. Другие теги или элементы, подобные тегам, удаляются, а их внутреннее содержимое остается. Пример: . Примечание: ожидается, что такой HTML является недопустимым: «> Примечание: функция также удаляет подобные тегам элементы: <> , , и т. д. Примечание: если встречается тег без завершающего символа > , то удаляется этот тег и весь следующий за ним текст:
  5. Мнемоники HTML и XML не декодируются. Они должны быть обработаны отдельной функцией.
  6. Пробелы в тексте удаляются и добавляются по следующим правилам:
  • Пробелы в начале и в конце извлеченного текста удаляются.
  • Несколько пробелов подряд заменяются одним пробелом.
  • Если текст разделен другими удаляемыми элементами и в этом месте нет пробела, он добавляется.
  • Это может привести к появлению неестественного написания, например: Helloworld , Helloworld — в HTML нет пробелов, но функция вставляет их. Также следует учитывать такие варианты написания: Hello

    world

    , Hello
    world . Подобные результаты выполнения функции могут использоваться для анализа данных, например, для преобразования HTML-текста в набор используемых слов.

  1. Также обратите внимание, что правильная обработка пробелов требует поддержки и свойств CSS display и white-space .

Синтаксис

extractTextFromHTML(x) 

Аргументы

  • x — текст для обработки. String.

Возвращаемое значение

  • Извлеченный текст.

Пример

Первый пример содержит несколько тегов и комментарий. На этом примере также видно, как обрабатываются пробелы. Второй пример показывает обработку CDATA и тега script . В третьем примере текст выделяется из полного HTML ответа, полученного с помощью функции url.

SELECT extractTextFromHTML(' 

A text withtags. '); SELECT extractTextFromHTML('CDATA]]> '); SELECT extractTextFromHTML(html) FROM url('http://www.donothingfor2minutes.com/', RawBLOB, 'html String');

A text with tags . The content within CDATA Do Nothing for 2 Minutes 2:00   

initcap​

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

initcapUTF8​

Как initcap, предполагая, что строка содержит набор байтов, представляющий текст в кодировке UTF-8. Не учитывает язык. То есть, для турецкого языка, результат может быть не совсем верным. Если длина UTF-8 последовательности байтов различна для верхнего и нижнего регистра кодовой точки, то для этой кодовой точки результат работы может быть некорректным. Если строка содержит набор байтов, не являющийся UTF-8, то поведение не определено.

firstLine​

Возвращает первую строку в многострочном тексте.

Синтаксис

firstLine(val) 

Аргументы

  • val — текст для обработки. String

Returned value

  • Первая строка текста или весь текст, если переносы строк отсутствуют.

Пример

select firstLine('foo\nbar\nbaz'); 

Python комментарии

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

Что такое комментарии и зачем они нужны?

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

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

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

Однострочные

В каждом отдельно взятом языке программирования используется собственный синтаксис однострочных комментариев. Зачастую в роли специального оператора, который сообщает компьютеру о том, что следующая строка является комментарием, задействуется двойной слеш (//). В Python эту функцию выполняет обычный символ решетки (#). Следующий код демонстрирует создание двух однострочных комментариев внутри самой программы.

# this is a comment # print("Hello World!")

Если запустить программу с этим кодом на выполнение, ничего не произойдет, поскольку, как уже было сказано ранее, комментарии полностью игнорируются компьютером. Писать пояснения можно не только на английском, но и на русском языке. Для русских комментариев в Python нужно подключить кодировку UTF-8 (Unicode Transformation Format, 8-bit). В противном случае, компилятор выдаст ошибку, не сумев правильно распознать символы кириллицы.

# coding: utf-8 # это комментарий

Комментарий может находиться в любой части программы, закрывая от компилятора не только целую строку, но и ее отдельную часть, идущую за символом решетки. Пояснение, расположенное следом за определенной командой, как правило, должно в максимально лаконичной форме передавать ее смысл. В следующем примере комментарии отображают точки старта и завершения программы, а также передают назначение функции print().

# coding: utf-8 # начало программы print("Hello World!") # выводим приветствие на экран # конец программы

Создавая комментарии, необходимо принять во внимание тот факт, что символ решетки не задействуется по прямому назначению, если заключен в строковый литерал. В приведенном ниже фрагменте кода данный оператор является частью строки под названием string. Работая в IDE (Integrated Development Environment), можно увидеть, что комментарии автоматически выделяются курсивом и обладают особой подсветкой, облегчающей их распознавание.

string = "# это не комментарий"

После ввода символа решетки, весь дальнейший текст будет считаться комментарием, вне зависимости от того, какие ключевые слова или операторы используются за ним.

string = "text" ####### это комментарий #######

В приведенном выше фрагменте кода за инициализацией строк string следует однострочный комментарий. Таким образом, количество символов решетки может быть произвольным.

Многострочные

Большинство высокоуровневых языков программирования поддерживают многострочные комментарии, которые помогают более подробно описывать детали реализации сложных для понимания блоков кода. Общепринятым синтаксисом для данной конструкции является слеш со звездочкой в начале выделенного блока (/*) и те же самые символы в обратном порядке в конце комментария (*/). Однако Python не поддерживает подобную возможность, вместо нее предлагая использовать совокупность нескольких однострочных комментариев.

# coding: utf-8 # программа Hello World # создает и выводит строку на экран # начало программы greeting = "Hello World!" # создаем строку print(greeting) # выводим строку на экран # конец программы

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

Однако современные IDE и редакторы кода, такие как PyCharm или NetBeans способны не только отображать синтаксис языка, но также поддерживают множество горячих клавиш для более быстрого написания программ. С их помощью можно моментально закомментировать огромный блок кода, а также оперативно избавиться от символов решетки в начале каждой строки. Это существенно ускоряет работу программиста и улучшает удобство тестирования.

Так, например, чтобы закомментировать несколько строк Python кода, в PyCharm, следует их выделить и нажать комбинацию клавиш +.

Docstring

Для создания документации к различным модулям, классам, функциям и методами в Python широко применяется такой инструмент как docstring. Согласно официальному соглашению PEP 8 (Python Enhancement Proposal), которое содержит в себе комплекс общепринятых норм по написанию кода, в Python docstring необходимо использовать в качестве поясняющей конструкции для всех создаваемых блоков кода. Такие примечания необходимо помещать сразу же после определения класса, метода, функции или модуля, заключая текст в тройные кавычки.

# coding: utf-8 # программа Hello World def greeting(): """Функция приветствия. Создает и выводит строку на экран. """ greeting = "Hello World!" # создаем строку print(greeting) # выводим строку на экран greeting() # вызываем функцию greeting() print(greeting.__doc__) # выводим docstring

Данный пример демонстрирует работу функции greeting(), которая создает строку и выдает ее на экран. Здесь применяется конструкция docstring, сообщающая программисту основные сведения о вызываемом методе. В отличие от обычных комментариев, docstring, как правило, обрабатывается компилятором и помещается в полученный байт-код. Во время выполнения программы записанные ранее сведения можно вывести на экран с помощью метода __doc__.

В спецификации PEP 8 определены базовые рекомендации использования docstring. Согласно общепринятым нормам в комментариях к функциям Python, первая строка документации должна представлять собой лаконичную сводку о назначении объекта, начинаясь с прописной буквы и заканчиваясь точкой. Вторая строка обязана быть пустой, в то время как последующие абзацы могут содержать более подробное описание внутренних особенностей объекта, его характеристики, особенности вызова и сторонние эффекты.

Применение docstring в качестве комментария

Несмотря на отсутствие прямой возможности создавать в коде Python 3 многострочные комментарии, язык Python позволяет использовать инструмент docstring для их замены. Сделать это можно при помощи тройных кавычек, просто поместив в них нужный текст. Таким образом, создается многострочный литерал, который не принадлежит какому-либо объекту, а поэтому не играет никакой роли во время обработки программного кода компилятором. Следующий пример демонстрирует применение docstring в качестве многострочного примечания в коде.

# coding: utf-8 """ программа Hello World создает и выводит строку на экран """ # начало программы greeting = "Hello World!" # создаем строку print(greeting) # выводим строку на экран # конец программы

Несмотря на простоту такого подхода, пользоваться им не рекомендуется, так как основным назначением docstring является документирование объектов.

Если тройные кавычки будут помещены сразу же после объявления метода или класса, компилятор воспримет их не как комментарий, а как описание docstring.

Именно по этой причине всегда лучше пользоваться символами решетки, комментируя большие объемы кода с помощью горячих клавиш IDE.

Заключение

Комментарии в языке программирования Python используются для создания собственных пояснений к исходному коду программы. Это позволяет улучшить его понимание другими людьми в процессе командной работы над большими проектами. В языке предусмотрены только однострочные комментарии, однако при помощи текстовых блоков можно получить аналог многострочных комментариев. Для создания документации к отдельным функциям, методам, классам и модулям применяются конструкции docstring. Общепринятые правила документирования исходного кода подробно описаны в сборнике рекомендаций PEP 8.

Перечислить и описать наборы данных с помощью Python

Пол А. Зандберген, кандидат наук, является профессором программы ГИС в университете острова Ванкувер. Он является автором Python Scripting для ArcGIS Pro и Advanced Python Scripting для ArcGIS Pro.

Продолжительность​

Типичные рабочие процессы ГИС используют множество наборов данных, включая форматы как табличных, так и пространственных данных. Для планирования проектов и управления данными важно хорошее понимание доступных табличных и пространственных наборов данных.

Процесс идентификации доступных наборов данных и определения их свойств можно автоматизировать с помощью кода Python. Это можно сделать, используя функции ArcPy для перечисления и описания наборов данных. Эти функции будут проиллюстрированы с использованием форматов табличных данных, шейп-файлов и классов пространственных объектов базы геоданных.

Темы, затронутые на этом уроке, более подробно объясняются в книге Python Scripting for ArcGIS Pro, опубликованной Esri Press.

Последний раз это руководство тестировалось 28 апреля 2023 года с помощью ArcGIS Pro 3.1 . Если у вас другая версия ArcGIS Pro , результат и функциональность могут отличаться.

Требования
  • ArcGIS Pro (см. варианты доступа к программному обеспечению)

Outline

Перечислить и описать наборы данных с помощью Python

Изучите основы перечисления и описания наборов данных с помощью кода Python.

Перечисление и описание наборов данных с помощью Python

Открытие проекта и обзор наборов данных

Прежде чем вы начнете использовать Python для перечисления и описания наборов данных, вы загрузите и извлечете .zip файл данных проекта и просмотрите наборы данных в ArcGIS Pro .

  1. Загрузите данные для этого руководства и извлеките содержимое в папку на своем компьютере.

Файл .zip содержит папку с именем PythonDesc . В этом руководстве данные находятся в папке C:\Lessons\PythonDesc\ . Можно использовать другую папку, но тогда надо учитывать, что и пути в последующих инструкциях и коде должны быть другими.

Запуск без шаблона.

Открывается новый проект под названием Untitled. Вы будете использовать ArcGIS Pro только для просмотра данных, поэтому нет необходимости переименовывать проект и сохранять свою работу.

Добавить подключение к папке.

Содержимое папки PythonDesc

Папка содержит два шейп-файла ( bike_routes.shp и watersheds.shp ), а также текстовый файл ( bike_racks.csv ) и таблицу базы данных ( gardens.dbf ). Также она содержит базу геоданных DC.gdb .

развернута.

База геоданных содержит три класса пространственных объектов ( boundary , neighborhoods и public_schools ), одну таблицу ( car_share_locations ) и один набор данных пространственных объектов ( Transportation ).

Набор данных Transportation развернут.

Набор классов объектов содержит четыре класса пространственных объектов ( roads , street_lights , traffic_analysis_zones и traffic_junctions ) и один набор сетевых данных ( traffic ). Типичные для ГИС-проектов наборы данных: классы пространственных объектов и табличные данные в различных форматах, а также другие элементы для организации этих данных. Вы будете использовать код Python для идентификации этих наборов данных на основе их типа и других свойств. Обратите внимание, что эти группировки означают, что данные проекта имеют многоуровневую вложенную структуру. Прежде чем приступить к работе с кодом Python , вы изучите эти наборы данных, просматривая файлы на своем компьютере.

Содержимое папки в проводнике Windows

Проводник показывает вам файлы. Две автономные таблицы, bike_racks.csv и gardens.dbf , представляют собой отдельные файлы. Шейп-файлы bike_routes и watersheds состоят из нескольких файлов с одинаковыми именами и разными расширениями. База геоданных DC представляет собой папку с расширением файла .gdb .

Содержание базы геоданных

В этой папке десятки файлов. Нет четко распознаваемой связи между этими файлами и элементами данных, которые видны при просмотре базы геоданных на панели Каталог в ArcGIS Pro . Например, вы не можете идентифицировать один или несколько файлов, составляющих один конкретный класс пространственных объектов. Это важно при использовании наборов данных ГИС в коде Python , поскольку это влияет на доступ и работу с наборами данных в разных форматах.

Вы изучили организацию данных в ArcGIS Pro и в проводнике Windows. Далее вы откроете файл Python и начнете использовать Python для перечисления и описания этих данных.

Откройте файл скрипта Python

В этом руководстве вы будете писать код Python с использованием IDLE. IDLE — это базовый редактор Python , входящий в состав ArcGIS Pro .

Чтобы убедиться, что для запуска вашего кода используется правильная версия Python , установленная с ArcGIS Pro , вы будете использовать ярлык для запуска IDLE.

Если у вас также установлен ArcGIS Desktop (ArcMap), контекстное меню будет включать ярлык Редактировать в IDLE . Не используйте этот ярлык; он откроет более старую версию Python .

  1. В проводнике Windows вернитесь на уровень выше в папку C:\Lessons\PythonDesc\ .
  2. Щелкните правой кнопкой describe_data.py и щелкните Редактировать в IDLE (ArcGIS Pro) .

Редактировать в IDLE (ArcGIS Pro)

Открытие IDLE таким образом открывает скрипт, используя активную среду Python ArcGIS Pro . Это гарантирует, что используется правильная версия Python . Хотя в этом руководстве в качестве редактора кода используется IDLE, код также работает и в других редакторах Python , например, в PyCharm или Spyder, а также в окне Python или Блокнотах внутри ArcGIS Pro .

Примечание:

Если Редактировать в IDLE (ArcGIS Pro) не появляется в контекстном меню, щелкните Пуск , разверните ArcGIS и щелкните Командная строка Python . В окне Командная строка Python введите idle и нажмите Enter . Появится IDLE ( Python 3.7 Shell). Щелкните Файл и щелкните Открыть . Найдите и откройте файл description_data.py .

Скрипт открыт в IDLE.

Откроется скрипт. Сценарий включает в себя три строки кода для начала работы. Первая строка — import arcpy — импортирует пакет ArcPy. Это обеспечивает то, что функциональные возможности ArcPy, включая функции, которые вы будете использовать для составления списка и описания наборов данных ГИС, будут доступны в скрипте. Вторая строка указывает путь, по которому находятся данные. Это значение присваивается переменной с именем mypath . В пути используется одинарная косая черта ( / ) вместо одной обратной косой черты ( \ ). Одна обратная косая черта в Python используется в качестве escape-символа и ее использование в путях может иметь непредвиденные последствия. Если за ней следуют определенные другие символы, они кодируют особое поведение. Например, \t означает вкладку, и такой путь, как C:\Lessons\toronto.gdb , приведет к добавлению в путь вкладки, что вызовет ошибку. Вместо одной косой черты можно добавить перед строкой букву r (чтобы строка не обрабатывалась) ( r»C:\Lessons\PythonDesc» ) или использовать двойную обратную косую черту ( «C:\\Lessons\\PythonDesc» ). Все три обозначения будут работать. Третья строка задает рабочую область. Рабочая область — это место по умолчанию для файлов, с которыми вы будете работать, таких как входные и выходные наборы данных. Рабочее пространство устанавливается в переменную mypath . Хотя рабочую область можно задать напрямую, не используя переменную mypath , использование отдельной переменной для пути, где находятся данные, дает определенные преимущества.

Например, если вы извлекли данные для этого руководства в папку C:\EsriLessons , вы должны отредактировать вторую строку следующим образом: mypath = «C:/EsriLessons/PythonDesc» Если путь относительно длинный, вы можете скопировать его из Проводника и вставить в скрипт. Вы можете сделать это, щелкнув папку правой кнопкой мыши (Windows 11) или щелкнув папку правой кнопкой мыши, удерживая нажатой клавишу Shift (Windows 10), и выбрав Копировать путь . Затем вы можете выбрать и удалить старый путь из скрипта и нажать Ctrl+V , чтобы вставить новый путь. Чтобы использовать путь в качестве допустимой рабочей области, он должен быть строкой Python , то есть путь должен быть заключен в кавычки. Вам также необходимо использовать для пути один из трех, упомянутых выше, стилей. Если вы скопируете путь Windows, он будет содержать обратную косую черту. Вы можете заменить каждую обратную косую черту двумя обратными косыми чертами или одной прямой косой чертой. Для длинных путей самым простым решением является добавление r перед строкой, чтобы сделать ее необрабатываемой строкой. Это гарантирует, что обратная косая черта не будет читаться как escape-символ. Теперь вы будете тестировать свой код.

Интерпретатор

Появится окно IDLE Shell с сообщением о перезапуске интерпретатора для вашего скрипта. Отображается путь к скрипту и имя файла. После паузы в несколько секунд окно IDLE Shell возвращает >>> . Может показаться, что ничего не произошло, потому что скрипт не имеет никаких инструкций для вывода данных в интерпретатор. Позже вы добавите выражения печати в свой код, чтобы вернуть информацию в интерпретатор. IDLE Shell также является местом, где вы можете печатать строки кода и немедленно их запускать.

Напечатайте рабочую область.

Путь к рабочей области, который вы задали в скрипте, напечатан в IDLE Shell. Скрипт импортировал модуль arcpy , установил переменную mypath , равную строке, которая содержала путь к данным урока, и задал рабочую область arcpy по этому пути. Напечатав значение arcpy.env.workspace в интерпретаторе, вы показали, что скрипт работает.

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

Опишите набор данных с помощью Python

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

Для этого вы будете использовать функцию da.Describe() .

  1. В окне редактора IDLE щелкните после строки arcpy.env.workspace = mypath и нажмите Enter , чтобы добавить новую строку.
  2. Введите следующий код и нажмите Enter :

Опишите велосипедные маршруты.

desc = arcpy.da.Describe(«bike_routes.shp») Функция da.Describe() — это функция модуля arcpy.da , которая используется для рабочих процессов доступа к данным. Функция возвращает словарь Python . Словарь Python состоит из пар ключей и соответствующих им значений. Ключи в словаре, возвращаемые функцией da.Describe() , являются свойствами набора данных.

print(f’baseName: ‘) При запуске скрипта печатается значение свойства baseName . В приведенной выше строке кода desc — это словарь свойств, а baseName — ключ в виде строки. Выражение desc[«baseName»] возвращает значение, связанное с этим ключом в словаре. Используемый здесь стиль форматирования печати известен как f-строка. F-строки также называются литералы форматированных строк. Это строки с буквенным префиксом f , содержащие переменные в фигурных скобках. Эти переменные заменяются значениями во время выполнения. В приведенном выше примере кода вокруг значения baseName используются двойные кавычки, чтобы сделать его строкой. Поскольку кавычки также используются для f-строк, необходимо использовать одинарные кавычки, чтобы отличить их от двойных кавычек. Эти различные типы кавычек могут использоваться взаимозаменяемо в Python , при условии, что они используются последовательно. Следующее выражение также является верным: print(f»baseName: «) Полный код пока выглядит следующим образом:

import arcpy mypath = "C:/Lessons/PythonDesc" arcpy.env.workspace = mypath desc = arcpy.da.Describe("bike_routes.shp") print(f'baseName: ')

Если вы сохранили данные в другом месте, ваша строка mypath будет другой.
Вы также можете использовать сочетание клавиш Ctrl+S .

Сообщить о базовом имени bike_routes.

Появится IDLE Shell с результатом: baseName: bike_routes Базовое имя данных — это имя файла без расширения файла. При обучении кодированию часто случаются ошибки. Типичная ошибка, с которой вы можете столкнуться при запуске этого скрипта, показана в следующем шаге.

desc = arcpy.da.Describe(«bikeroutes.shp»)

Сообщение об ошибке значения

IDLE Shell показывает сообщение об ошибке: ValueError: Object: Error in accessing describe Ошибка предполагает, что существует проблема с функцией da.Describe() . Причина этой ошибки в том, что имя класса пространственных объектов написано неправильно, поэтому его невозможно найти. Если вы столкнулись с этой ошибкой, дважды проверьте правильность имени. Другая возможная ошибка заключается в том, что была неправильно задана рабочая область, поэтому обязательно проверьте путь, используемый для вашей рабочей области.

Примечание:

Помимо da.Describe() , для изучения свойств наборов данных ГИС вы можете использовать обычную функцию ArcPy Describe() . Синтаксис немного отличается от da.Describe() . Функция Describe() возвращает объект Describe , и вы можете использовать этот объект для проверки его свойств.

desc = arcpy.da.Describe(«bike_routes.shp»)

print(f'extension: ') print(f'dataType: ') print(f'shapeType: ')

Результаты с дополнительными свойствами напечатаны

Печатаются базовое имя, расширение файла, тип данных и тип геометрии входного набора данных. В панели Каталог легко увидеть, что bike_routes.shp представляет собой линейный шейп-файл, но теперь вы можете получить доступ к этим свойствам и в скрипте Python . Есть много других свойств, но эти обеспечивает общее понимание каждого набора данных. Полный список свойств можно найти в разделе Документация ArcPy на страницах справки ArcGIS Pro . Существует множество различных свойств, и на страницах справки они организованы в группы свойств. Группа свойств Describe по ссылке выше включает некоторые общие свойства для всех наборов данных, в частности baseName , extension и datatype . Помимо этого, есть группы свойств для определенных типов наборов данных. Например, группа свойств FeatureClass включает свойство shapeType , использованное в предыдущем примере кода. Не все наборы данных будут иметь это свойство, поскольку они могут не содержать никакой геометрии. Некоторые свойства может быть сложно найти при навигации по страницам справки. Например, свойство экстента находится в группе свойств Dataset . Группы свойств — это только организация страниц справки и они не влияют на код.

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

Опишите другие наборы данных

Теперь, когда у вас есть скрипт, описывающий набор данных bike_routes.shp , вы измените его для описания других данных.

  1. Измените строку desc = arcpy.da.Describe(«bike_routes.shp») , заменив bike_routes.shp на watersheds.shp .

desc = arcpy.da.Describe(«watersheds.shp»)

Результаты для шейп-файла с водоразделами

desc = arcpy.da.Describe(«bike_racks.csv»)

Ключевая ошибка в файле CSV

IDLE Shell показывает сообщение об ошибке. KeyError: ‘shapeType’ Это означает, что при использовании словаря произошла ошибка, поскольку ключ словаря shapeType не существовал. Если подумать, что означает shapeType , это имеет смысл. Текстовый файл не имеет геометрии, поэтому его нельзя отнести к категории Point, Polyline или Polygon. Свойство отсутствует в словаре, поскольку оно не имеет смысла для файлов CSV. Словарь, возвращаемый da.Describe() , включает только те ключи и значения, которые имеют смысл для данного типа данных. Вы можете предотвратить возникновение ошибки, выполнив проверку.

Добавьте новую строку.

if «shapeType» in desc: Строка содержит выражение if . Строки выражения If включают проверку, в данном случае определяющую, есть ли строка «shapeType» в словаре desc . После теста — за выражениями if — следует двоеточие. Следующая строка — это первая строка блока кода, который выполняется при условии, что тест оценивается как True. Строки в блоке кода должны иметь отступ, чтобы показать Python , что они вместе и должны выполняться только в том случае, если тест верен.

Сделайте отступ в последней строке.

Последние две строки кода выглядят следующим образом:

if "shapeType" in desc: print(f'shapeType: ')

Результаты для файла CSV

Результаты для файла CSV печатаются без ошибок. Выводятся первые три свойства, затем выражение if проверяет, содержит ли словарь «shapeType» , и, поскольку его нет, последняя строка не выполняется. Как узнать, какие свойства доступны для данного набора данных? Вы можете увидеть свойства, распечатав весь словарь. Далее вы увидите, как напечатать свойства.

Распечатать все свойства набора данных

Вы узнали, как напечатать определенные ключи и значения для словаря и как проверить, есть ли конкретный ключ в словаре. Теперь вы узнаете, как напечатать весь словарь.

  1. Выберите последние пять строк скрипта.

Сюда входят строки, выводящие первые три свойства, а также выражение if и последняя строка печати.

Закомментировать область

Перед выбранными строками теперь стоят двойные знаки решетки. Добавление # преобразует строку в комментарий для Python , поэтому эти строки не будут выполняться при выполнении кода. Вы также можете сделать это, введя с клавиатуры знак решетки в начале каждой строки, но опция меню в IDLE позволяет вам сделать это для нескольких строк за один шаг. Вы можете вернуть состояние строк, выбрав строки и в меню Формат выбрав Раскомментировать область .

for k, v in desc.items(): print(f": ")

Цикл для печати всех свойств.

Первая из двух новых строк запускает цикл for . Циклы For берут набор входных данных и блок кода с отступом и запускают блок кода для каждого из входных данных. В этом случае цикл for перебирает пары ключ-значение, возвращаемые при вызове метода items для словаря desc . См. документацию Python для получения дополнительной информации о цикличности в словарях. Вторая из двух строк имеет отступ. Эта строка является единственной строкой блока кода цикла for . При каждом запуске цикла эта строка выводит форматированную строку, содержащую значения переменных k и v (ключ и значение), разделенные двоеточием.

Результат выполнения цикла списка ключ-значение для CSV-файла

Код перебирает все элементы словаря и печатает ключи и значения. Печать словаря позволяет вам увидеть свойства определенного типа данных. Далее вы рассмотрите некоторые элементы внутри базы геоданных.

Опишите классы пространственных объектов базы геоданных

Теперь, когда вы узнали, как исследовать свойства файловых шейп-файлов и таблиц CSV, вы будете использовать Python для изучения свойств элементов в базе геоданных. Вы будете использовать набор выражений печати, который использовали ранее, а не перечислять все свойства.

  1. Выберите пять строк кода, которые ранее были закомментированы, нажмите Формат и нажмите Раскомментировать область .
  2. Закомментируйте последние две строки кода, которые использовались для итерирования словаря.
  3. Измените строку mypath = «C:/Lessons/PythonDesc» , чтобы добавить /DC.gdb .

mypath = «C:/Lessons/PythonDesc/DC.gdb»

Опишите класс пространственных объектов boundary.

desc = arcpy.da.Describe(«boundary») Элементы в базе геоданных не имеют расширения файла, поэтому они различаются только по типу данных.

Результаты скрипта по описанию boundary.

Второе свойство — это расширение файла. Хотя это свойство является допустимым ключом в словаре, его значение пусто. Так как пустые расширения файлов являются обычным явлением для элементов базы геоданных, вы можете добавить еще одно выражение if , чтобы печатать строку расширения только, если оно присутствует.

if desc["extension"] != "": print(f'extension: ')

Строки отображения расширения по условию

Оператор сравнения != означает «не равно». Допустимые операторы сравнения в Python : == (равно), != (не равно), < (меньше), (больше) и >= (больше или равно). Имейте в виду, что кажется, будто =! и <> должны тоже работать, но они не являются допустимыми операторами сравнения и вызовут синтаксическую ошибку. Первая из этих двух строк проверяет, не равно ли значение, связанное с ключом «extension», пустой строке (две кавычки, между которыми ничего нет). Если это оценивается как Истина, выполняется строка печати форматированной строки с именем ключа расширения и связанным значением для этого ключа.

Результаты кода с условием проверки расширения

Код запускается и проверяет, не имеет ли ключ расширения пустое значение. Если значение пустое, тест оценивается как Ложь, тогда строка блока кода с отступом не выполняется, и код не печатает эту строку. Код переходит к следующей строке за пределами блока кода и продолжает работу, печатая dataType и shapeType. Аналогичным образом вы можете изучить другие элементы базы геоданных, изменив имя элемента в функции da.Describe() .

desc = arcpy.da.Describe(«car_share_locations»)

Описать таблицу car_share_locations

Элемент car_share_locations представляет собой таблицу базы геоданных. Она не имеет расширения и записи для shapeType, поэтому эти строки не печатаются.

desc = arcpy.da.Describe(«Transportation»)

Результат описания Transportation

Transportation — это набор данных объектов в базе геоданных. Набор классов объектов содержит элементы данных, которые имеют общую систему координат. Набор классов объектов можно использовать в качестве рабочей области.

mypath = «C:/Lessons/PythonDesc/DC.gdb/Transportation» Теперь вы можете описать классы пространственных объектов и другие элементы, находящиеся внутри набора пространственных данных.

Код для описания сети

desc = arcpy.da.Describe(«Traffic»)

Описание сети Traffic

Traffic — это набор сетевых данных. Наборы сетевых данных используются для моделирования транспортных сетей. Их создают из исходных объектов, которые могут состоять из простых объектов (линий и точек) и поворотов, а также они хранят связность исходных объектов. Сетевой анализ всегда производится с набором сетевых данных. Существуют и другие типы данных, которые можно использовать в da.Describe() , но описанные вами элементы охватывают наиболее типичные наборы данных ГИС. Однако описание каждого набора данных по отдельности может быть громоздким. Удобнее создать список различных наборов данных, доступных в рабочей области, без необходимости вводить их имена по отдельности.

Список файлов в рабочей области

Распространенной задачей при написании скриптов в Python является использование в работе нескольких наборов данных. Вводить имя каждого отдельного набора данных трудоемко и требует много времени. ArcPy включает несколько функций для создания описи наборов данных. Эти функции обычно возвращают наборы данных в виде списка Python , который можно использовать для дальнейшей обработки.

  1. Вы начнете новый скрипт.
  2. В окне редактора IDLE нажмите Файл и нажмите Сохранить как .

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

Удалите все, кроме первых трех строк.

mypath = «C:/Lessons/PythonDesc» Останется путь к базовой папке с данными этого руководства.

files = arcpy.ListFiles() print(files)

Перечисление и вывод списка файлов.

Первая из этих строк создает новую переменную с именем files и устанавливает ее равной результату вызова функции ListFiles . За функциями следует список параметров, заключенных в круглые скобки. В данном случае функция ListFiles() не требует никаких входных параметров, поэтому скобки пусты. Вторая строка выводит список. Код должен быть следующим:

import arcpy mypath = "C:/Lessons/PythonDesc" arcpy.env.workspace = mypath files = arcpy.ListFiles() print(files)

Список данных Первые результаты функции ListFiles

Это список файлов в папке PythonDesc . Списки Python заключаются в квадратные скобки. Функция ListFiles возвращает файлы в текущей рабочей области. Это означает, что если рабочая область не была задана с помощью arcpy.env.workspace, результатом будет пустой список, и скрипт напечатает None . Функция не имеет обязательных параметров и автоматически использует текущую рабочую область. Перечисленные файлы очень похожи на те, которые отображаются в проводнике. Есть одно исключение. База геоданных — это папка в проводнике, но она включена в результат ListFiles() . В результате DC.gdb отображается здесь как файл, хотя технически это папка, содержащая файлы. Вы ограничиваете поиск, чтобы возвращать только определенные типы файлов.

files = arcpy.ListFiles(«*.csv») Функция ListFiles может принимать необязательный параметр, называемый wildcard , который позволяет указать строку, которую должны содержать результаты поиска. Звездочка представляет ноль или большее количество неопределенных символов, поэтому этот поиск по подстановочным знакам вернет любое имя файла, которое включает расширение .csv .

Скрипт выводит список соответствующих результатов. В данном случае это список с одним элементом. [‘bike_racks.csv’] Данный способ работает для любого количества файлов и позволяет получить все файлы одного типа в виде списка и выполнить одну и ту же задачу для каждого файла. Также вы можете перечислить другие типы файлов, такие как .xlsx , .dbf и т. д., или сопоставить другие части строки имени. Например, использование подстановочной строки «*bike*» возвращает список всех имен файлов, которые включают bike : [‘bike_racks.csv’, ‘bike_routes.dbf’, ‘bike_routes.prj’, ‘bike_routes.sbn’, ‘bike_routes.sbx’, ‘bike_routes.shp’, ‘bike_routes.shx’]

mypath = «C:/Lessons/PythonDesc/DC.gdb»
files = arcpy.ListFiles()

Появится список результатов.

Это те же файлы, которые можно увидеть в папке DC.gdb с помощью Проводника. Функция ListFiles() не удобна для изучения содержимого базы геоданных, поскольку наборы данных не соответствуют отдельным файлам. Но есть функция перечисления классов пространственных объектов.

Получите список классов пространственных объектов в рабочей области

Классы пространственных объектов являются одними из наиболее часто используемых типов наборов данных ГИС. Функция ListFeatureClasses() возвращает список классов пространственных объектов в текущей рабочей области.

  1. Отредактируйте строку mypath = , чтобы удалить /DC.gdb из пути.

mypath = «C:/Lessons/PythonDesc» Останется путь к базовой папке с данными этого руководства.
files = arcpy.ListFeatureClasses() Код должен быть следующим:

import arcpy mypath = "C:/Lessons/PythonDesc" arcpy.env.workspace = mypath files = arcpy.ListFeatureClasses() print(files)

Скрипт печатает список с двумя классами пространственных объектов. [‘bike_routes.shp’, ‘watersheds.shp’] В данном случае классы объектов являются шейп-файлами. Иногда это может быть причиной путаницы. Термин «класс объектов» используется для описания однородной совокупности объектов, каждый из которых имеет одинаковое пространственное представление (например, точки, линии или полигоны) и общий набор атрибутов. Двумя наиболее распространенными типами классов пространственных объектов в ArcGIS Pro являются шейп-файлы и классы пространственных объектов базы геоданных. Функция ListFeatureClasses() работает как для шейп-файлов, так и для классов пространственных объектов базы геоданных, но для данной рабочей области она возвращает только один из них. Если рабочая область представляет собой папку, функция выводит список шейп-файлов. Если рабочей областью является база геоданных, функция выводит список классов пространственных объектов базы геоданных.

Вывести список классов пространственных объектов в базе геоданных.

mypath = «C:/Lessons/PythonDesc/DC.gdb» Это путь к файловой базе геоданных.

Скрипт печатает список из трех классов пространственных объектов. [‘neighborhoods’, ‘boundary’, ‘public_schools’] Список не включает классы пространственных объектов внутри набора классов Transportation , потому что это другая рабочая область. Вы можете использовать символ для фильтрации результатов из ListFeatureClasses() . Например, вы можете получить все классы объектов, которые начинаются с определенной буквы. Функция также позволяет применять фильтр по типу объекта. Синтаксис функции ListFeatureClasses() следующий: ListFeatureClasses (, , ) Параметр функции feature_type позволяет ограничить результат в зависимости от типа класса пространственных объектов.

files = arcpy.ListFeatureClasses(«», «POINT») Первый параметр, wild_card, не используется, но поскольку параметры имеют предписанный порядок, этот параметр необходимо пропустить. Пустая строка «» действует как заполнитель, указывающий, что параметр не используется. Вы также можете использовать ключевое слово Python None . Вы также можете указать параметры по имени, и в таком случае нет необходимости придерживаться исходного порядка. Два допустимых способа записи строки: files = arcpy.ListFeatureClasses(None, «POINT») files = arcpy.ListFeatureClasses(feature_type=»POINT») Вы также можете использовать знак решетки ( «#» ), чтобы пропустить параметр инструмента. Однако это не работает для неинструментальных функций ArcPy. По большей части Python чувствителен к регистру, но строки, используемые в функциях ArcPy, обычно к регистру не чувствительны. В результате вы можете использовать в параметре «Point» или «point» . Третий параметр, который может принимать функция ( feature_dataset ), не используется и может быть полностью опущен, так как он находится в конце последовательности параметров.

Скрипт печатает один точечный класс пространственных объектов в рабочей области. [‘public_schools’]

Вывести список таблиц и наборов данных

Вы перечислили файлы и классы объектов. Далее вы перечислите таблицы и наборы данных объектов.

  1. Отредактируйте строку mypath = , чтобы удалить /DC.gdb из пути.

mypath = «C:/Lessons/PythonDesc» Останется путь к базовой папке с данными этого руководства.
files = arcpy.ListTables() Код должен быть следующим:

import arcpy mypath = "C:/Lessons/PythonDesc" arcpy.env.workspace = mypath files = arcpy.ListTables() print(files)

Вывод списка таблиц в папке.

Скрипт печатает список из двух таблиц в рабочей области. [‘gardens.dbf’, ‘bike_racks.csv’]
mypath = «C:/Lessons/PythonDesc/DC.gdb» Она задает путь к базе геоданных.

import arcpy mypath = "C:/Lessons/PythonDesc/DC.gdb" arcpy.env.workspace = mypath files = arcpy.ListTables() print(files)

Скрипт печатает список с единственной таблицей в базе геоданных. [‘car_share_locations’]
files = arcpy.ListDatasets()

import arcpy mypath = "C:/Lessons/PythonDesc/DC.gdb" arcpy.env.workspace = mypath files = arcpy.ListDatasets() print(files)

Скрипт печатает список с одним набором данных объектов в базе геоданных. [‘Transportation’]

mypath = «C:/Lessons/PythonDesc/DC.gdb/Transportation» Это задает путь к набору классов объектов Transportation.

import arcpy mypath = "C:/Lessons/PythonDesc/DC.gdb/Transportation" arcpy.env.workspace = mypath files = arcpy.ListDatasets() print(files)

Скрипт печатает список с одним набором сетевых данных в наборе классов Transportation. [‘traffic’] Функция ListDatasets() работает с различными элементами данных. Включая наборы классов объектов, геометрические сети, сети, наборы данных участков, каталоги растров, топологию и некоторые другие.

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

Итерация по списку

Создание списка данных обычно является первым шагом более сложного рабочего процесса. В большинстве случаев вам необходимо выполнить определенную задачу для каждого набора данных. Вы будете использовать цикл Python for для итерации по списку.

Вы начнете новый скрипт.

  1. Нажмите Файл и затем Сохранить как .
  2. Назовите новый файл iterate_data.py .
  3. Отредактируйте строку mypath = , чтобы удалить /Transportation из пути.

mypath = «C:/Lessons/PythonDesc/DC.gdb»
files = arcpy.ListFeatureClasses()

Двоеточие в конце строки указывает на начало блока кода. Цикл for перебирает элементы в списке, и код с отступом в блоке кода выполняется для каждого элемента. Когда вы нажимаете Enter после строки кода, заканчивающейся двоеточием, следующая строка кода автоматически получает отступ. В каждом цикле временной переменной file присваивается одно из имен из списка файлов в переменной files .

desc = arcpy.da.Describe(file) Функция da.Describe() возвращает словарь со свойствами классов пространственных объектов. Эта строка кода будет выполняться для каждого класса пространственных объектов в списке классов пространственных объектов.

print(desc[«baseName»]) Эта строка должна иметь отступ в четыре пробела, чтобы соответствовать предыдущей строке. Это часть блока кода цикла for и будет выполняться для каждого класса пространственных объектов из списка. Эта строка извлекает и печатает значение, хранящееся в словаре desc , с помощью ключа baseName . Полный код выглядит следующим образом:

import arcpy mypath = "C:/Lessons/PythonDesc/DC.gdb" arcpy.env.workspace = mypath files = arcpy.ListFeatureClasses() for file in files: desc = arcpy.da.Describe(file) print(desc["baseName"])

Распечатайте описания.

Скрипт печатает имена трех классов пространственных объектов в трех новых строках.

neighborhoods boundary public_schools

Вы измените код, чтобы сделать результаты более информативными.

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

 data = desc["dataType"] shape = desc["shapeType"] print(f" is a with geometry")

Этот код сохраняет значения тип данных и геометрия в переменных data и shape . Последняя строка создает и печатает форматированную строку с подставленным в нее содержимым трех переменных.

Скрипт печатает три форматированные строки:

neighborhoods is a FeatureClass with Polygon geometry boundary is a FeatureClass with Polygon geometry public_schools is a FeatureClass with Point geometry

Вы создали список классов пространственных объектов базы геоданных, итерировали этот список и распечатали информацию о каждом классе. Далее вы добавите код для отслеживания количества классов пространственных объектов каждого типа.

Отслеживание количества классов пространственных объектов по типу

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

  1. Вставьте новую строку перед строкой for file in files: .
  2. Добавьте следующие три строки перед циклом for :
count_point = 0 count_line = 0 count_poly = 0

Эти строки присваивают трем новым переменным нулевые значения. Вы будете использовать эти переменные для отслеживания количества классов объектов. Они обнуляются перед циклом for , чтобы в цикле for вы могли наращивать их в зависимости от типа класса пространственных объектов. Если вы определили их и установили их равными нулю внутри цикла for , каждый раз при выполнении цикла вы теряли данные из предыдущего цикла.

Установите счетчики и обрежьте строки в цикле for.

if desc["shapeType"] == "Point": count_point += 1

Приращения счетчика для точек

Строка if должна иметь тот же отступ, что и строка desc . Строка if проверяет, равно ли значение в словаре desc , хранящемся в ключе shapeType , строке Point . В Python двойной знак равенства == используется для проверки на равенство, а одинарный знак равенства используется для присвоения значений переменным. За строкой следует двоеточие, а следующая строка имеет отступ, поскольку это новый блок кода. Если выражение ложно, ничего не происходит. Если выражение является истиной, выполняется блок кода, следующий за выражением if . Блок кода добавляет единицу к значению, хранящемуся в переменной count_point . Когда цикл выполняется, он проверяет, является ли каждый элемент из списка классов пространственных объектов классом пространственных объектов Point, и, если это так, он добавляет единицу. Когда цикл завершится, переменная counter будет содержать количество классов пространственных объектов Point. Вы добавите еще два оператора if для проверки других типов геометрии.

Новая строка выравнивается с существующим отступом в текущем блоке кода. Однако вы хотите, чтобы следующий выражение if было выровнено с тем же отступом, что и предыдущее выражение if .

Это регулирует отступ, чтобы выровнять новую строку с предыдущим выражением if .

if desc["shapeType"] == "Polyline": count_line += 1 if desc["shapeType"] == "Polygon": count_poly += 1

Три выражения if выровнены.

Вы можете настроить отступ, используя клавишу Backspace для удаления отступа, или добавив четыре пробела для добавления отступа. Теперь каждый элемента в списке файлов будет описан, словарь результатов описания будет храниться в переменной desc , а данные, хранящиеся в ключе shapeType , будут проверяться на соответствие строкам Point , Polyline или Polygon . При совпадении к переменной счетчика для этой геометрии добавляется единица. Теперь вы добавите несколько строк для печати информации.

print(f"Count of Point feature classes: ") print(f"Count of Polyline feature classes: ") print(f"Count of Polygon feature classes: ")

Завершенный скрипт для подсчета геометрий и печати результатов

Поскольку последние три строки не имеют отступа, они не являются частью блока кода цикла for и запускаются только после завершения цикла и записи количества каждого типа геометрии.

Скрипт печатает следующие три строки:

Count of Point feature classes: 1 Count of Polyline feature classes: 0 Count of Polygon feature classes: 2

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

Вы напечатали количество классов пространственных объектов трех типов геометрии. Далее вы увидите более компактный способ сделать то же самое.

Получить количество с помощью фильтра типа объектов

Другой способ получить количество классов объектов в рабочей области — использовать функцию ListFeatureClasses() с фильтром по типу объектов.

  1. Нажмите Файл и затем Сохранить как .
  2. Назовите новый файл filter_by_type.py .
  3. Выберите строки между первыми тремя и последними тремя строками скрипта, нажмите Формат и нажмите Закомментировать область .

Средняя часть скрипта закомментирована.

count_point = len(arcpy.ListFeatureClasses(feature_type="POINT")) count_line = len(arcpy.ListFeatureClasses(feature_type="POLYLINE")) count_poly = len(arcpy.ListFeatureClasses(feature_type="POLYGON"))

Добавлены строки для подсчета с использованием фильтра feature_type

Эти три строки задают переменные count_point , count_line и count_poly по-новому. Вместо того, чтобы устанавливать их равными нулю и увеличивать их значения, каждая строка здесь использует функцию ListFeatureClasses() с дополнительным параметром feature_type . Эта функция создает список классов пространственных объектов, соответствующих параметру фильтра. Функция len определяет длину итогового списка, который представляет собой количество классов пространственных объектов этого типа.

Скрипт печатает следующие три строки:

Count of Point feature classes: 1 Count of Polyline feature classes: 0 Count of Polygon feature classes: 2

Это кодовое решение, за исключением закомментированных строк, короче, чем предыдущий способ, который использует da.Describe() для определения типа геометрии. Однако da.Describe() позволяет проверять свойства, отличные от типа геометрии, такие как количество полей, пространственный экстент и система координат.

Вы изучили два способа получения количества классов пространственных объектов разных типов и вывода этой информации в IDLE Shell. Далее вы увидите пример использования обоих этих способов в скрипте, который перечисляет и описывает содержимое рабочей области и записывает результаты в текстовый файл.

Запись информации о перечне элементов в текстовый файл

Хотя печать в интерактивном окне обеспечивает немедленную обратную связь, иногда может быть полезнее записать результаты в текстовый файл. Готовый скрипт для этого находится в папке PythonDesc .

  1. В проводнике перейдите в папку PythonDesc , в которую вы извлекли данные.
  2. Щелкните правой кнопкой мыши write_inventory.py и выберите Редактировать в IDLE (ArcGIS Pro) .

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

import arcpy import os

Модуль os предоставляет доступ к функциям операционной системы через Python . В следующем разделе задаются некоторые переменные для путей и рабочей области.

#Variables for paths and workspace root = "C:/Lessons/PythonDesc" gdb = "DC.gdb" textfile = "inventory.txt" arcpy.env.workspace = os.path.join (root, gdb) output = os.path.join(root, textfile)

Раздел начинается с комментария, определяющего, что делает эта часть кода. Это еще одна рекомендация для написания кода Python .

Независимо от корневой папки, имя файловой базы геоданных и имя текстового файла могут оставаться теми же, как и строка кода, задающая файл arcpy.env.workspace . Используя переменную для пути к корневой папке, вам нужно обновить ее только в одном месте скрипта. Функция os.path.join() используется для создания полных путей из переменной root и переменных gdb и textfile . Далее создается новый пустой текстовый файл с помощью функции open() и указанием режима записи с помощью «w» . Если файл с таким именем уже существует, он будет перезаписан.

#Create new textfile to write results f = open(output, "w")

В следующем разделе скрипта используется функция ListFeatureClasses() для получения списков трех типов геометрии.

#Create list of feature classes by geometry type points = arcpy.ListFeatureClasses("", "POINT") lines = arcpy.ListFeatureClasses("", "POLYLINE") polygons = arcpy.ListFeatureClasses("", "POLYGON")

Следующий раздел скрипта записывает контекстную информацию в текстовый файл, используя форматированные строки. \n в конце каждой из этих строк добавляет escape-символ, который кодирует новую строку, поэтому информация будет представлена ​​в виде трех отдельных строк в текстовом файле.

f.write(f"Workspace of interest: \n") f.write(f"This workspace contains the following feature classes:\n") f.write(f"Count of Point feature classes: \n")

Третья из этих строк использует len(points) для вставки длины списка точечных классов, количества классов точечных объектов в рабочей области. Следующая строка содержит выражение if , проверяющий наличие элементов в списке классов точечных объектов. Если точечных классов нет, ничего не происходит до следующей строки f.write . Если классы точечных объектов есть, запускается блок кода после строки, и скрипт записывает новую форматированную строку в текстовый файл.

if len(points) != 0: f.write(f"The names of the Point feature classes are:\n") for point in points: desc = arcpy.da.Describe(point) f.write(f'\t\n') f.write(f"Count of Polyline feature classes: \n")

Далее цикл for обрабатывает каждый из классов точечных объектов в списке. Внутри цикла переменная desc содержит словарь описания класса пространственных объектов arcpy.da.Describe . В следующей строке записывается форматированная строка с именем класса пространственных объектов, извлеченная из словаря с помощью ключа baseName . Строка имеет отступ на одну длину табуляции с помощью escape-символа \t , затем добавляется новая строка с \n . Затем цикл повторяется для всех других классов точечных объектов. Когда классов больше нет, строка f.write запускает и добавляет в текстовый файл текст, описывающий количество классов линейных объектов, и начинает новую строку с \n . Остальная часть этого раздела описывает классы линейных и полигональных объектов таким же образом.

 if len(lines) != 0: f.write(f"The names of the Polyline feature classes are:\n") for line in lines: desc = arcpy.da.Describe(line) f.write(f'\t\n') f.write(f"Count of Polygon feature classes: \n") if len(polygons) != 0: f.write(f"The names of the Polygon feature classes are:\n") for polygon in polygons: desc = arcpy.da.Describe(polygon) f.write(f'\t\n')

Когда цикл обработки классов полигональных объектов завершается, следующая строка закрывает текстовый файл. f.close() Последний раздел использует функцию startfile модуля os для открытия текстового файла отчета.

#Open the resulting output file os.startfile(output)

Текстовый файл с результатами открывается в Блокноте.

Текстовый файл открывается в Блокноте. Результаты записываются в текстовый файл с использованием метода write() . Символ новой строки \n используется для обеспечения правильного форматирования каждого результата на новой строке. Символ табуляции \t используется для улучшения читаемости за счет отступа имен классов пространственных объектов. Для этих специальных символов используется обратная косая черта. Вместо записи в текстовый файл вы можете распечатать результаты в интерактивном окне, заменив все экземпляры f.write на print . Если вы хотите запустить скрипт в ArcGIS Pro как инструмент-скрипт, вы можете записать информацию в сообщения инструмента геообработки, заменив f.write на arcpy.AddMessage .

  • Код Python можно использовать для описания свойств наборов данных ГИС, таких как тип данных, расширение файла и геометрия.
  • ArcPy включает несколько функций для создания списков наборов данных. Доступны специальные функции для создания списков файлов, наборов данных, таблиц и классов пространственных объектов.
  • Перечисляя и описывая наборы данных с помощью кода Python , вы можете создать подробный перечень наборов данных ГИС в рабочей области. Затем вы сможете обрабатывать каждый набор данных по-своему в зависимости от его характеристик.
  • Код Python может использоваться для записи информации в текстовые файлы. Это полезно для создания отчетов и ведения журналов ошибок.

Вас также могут заинтересовать книги Python Scripting for ArcGIS Pro и Advanced Python Scripting for ArcGIS Pro автора Dr. Paul A. Zandbergen, опубликованные в Esri Press.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *