Більше

Розуміння EOL під час сканування рядкового літералу з Перекласифікації в ArcPy?

Розуміння EOL під час сканування рядкового літералу з Перекласифікації в ArcPy?


Я намагаюся перекласифікувати растр за допомогою сценарію Python. Я знаю, що можу просто використовувати інструмент в ArcMap, але я хочу почати розуміти код, що стоїть за ним.

Хтось може сказати мені, чому це не працює і як це виправити? Я отримую таке повідомлення про помилку: EOL під час сканування рядкового літералу (reclass_script.py, рядок 17).

#Оператори імпорту: import arcpy import arcpy.gp import os #Reclassify arcpy.gp.Reclassify_sa ("S:/MSproject/swregap/swregap_prj", "VALUE", "0 0; 5 5; 9 9; 11 11; 12 12 ; 14 14; 15 15; 17 17; 18 18; 19 19; 20 20; 21 21; 22 22; 24 24; 26 26; 28 28; 30 30; 32 32; 33 33; 34 34; 35 35; 36 36; 41 41; 45 45; 48 48; 51 51; 52 52; 55 55; 56 56; 57 57; 58 58; 59 59; 60 60; 61 61; 64 64; 65 65; 67 67; 68 68; 71 71; 76 76; 77 113; 79 113; 80 113; 81 113; 82 82; 83 113; 84 113; 85 85; 86 86; 91 91; 92 92; 93 93; 95 95; 96 96; 105 105 ; 108 108; 110 110; 111 111; 112 112; 113 113; 114 114; 116 116; 117 117; 118 113; 119 119; 122 122 "," S:/MSproject/swregap/swgap_RECLASS "," ДАНІ ")

Дякую, Майкл і Полігео! Зразок коду довідкової сторінки «Перекласифікувати» був насправді надзвичайно корисним - я пам’ятатиму, що загляну туди в майбутньому. Мені вдалося змусити його працювати за допомогою наступного сценарію, який я підняв майже точно з цієї сторінки довідки.

Якщо в когось виникне подібне питання, це перекласифікує ті значення, які перераховані у змінній remap, і залиште всі інші значення в спокої (мета включення слова "ДАНІ" під час виконання рекласифікації. Досі не зовсім зрозуміло, як точно знати, які оператори імпорту використовувати ...

#Оператори імпорту імпортувати arcpy з arcpy імпортувати env з arcpy.sa імпортувати * #Встановити середовища env.workspace = "S:/MSproject/swregap" #Встановити локальні змінні inRaster = "swregap_clip" reclassField = "VALUE" remap = RemapValue ([[ 77, 113], [79, 113], [80, 113], [81, 113], [83, 113], [84,113], [118,113]]) # Перевірте ліцензію розширення ArcGIS Spatial Analyst arcpy.CheckOutExtension ("Spatial") # Виконати Reclassify outReclassify = Перекласифікувати (inRaster, reclassField, remap, "DATA") # Зберегти вихідний outReclassify.save ("S:/MSproject/swregap/Recls_NoRipar")

Я думаю, ви отримуєте цю помилку, тому що в рядку нижче є отвір " (перед 0 0), який не був зіставлений іншим, щоб закрити його:

arcpy.gp.Reclassify_sa ("S:/MSproject/swregap/swregap_prj", "VALUE", "0 0; 5 5; 9 9; 11 11; 12 12; 14 14; 15

Як тест зробіть це єдиним довгим рядком, і помилка повинна зникнути:

arcpy.gp.Reclassify_sa ("S:/MSproject/swregap/swregap_prj", "VALUE", "0 0; 5 5; 9 9; 11 11; 12 12; 14 14; 15 15; 17 17; 18 18; 19 19; 20 20; 21 21; 22 22; 24 24; 26 26; 28 28; 30 30; 32 32; 33 33; 34 34; 35 35; 36 36; 41 41; 45 45; 48 48; 51 51; 52 52; 55 55; 56 56; 57 57; 58 58; 59 59; 60 60; 61 61; 64 64; 65 65; 67 67; 68 68; 71 71; 76 76; 77 113; 79 113; 80 113 ; 81 113; 82 82; 83 113; 84 113; 85 85; 86 86; 91 91; 92 92; 93 93; 95 95; 96 96; 105 105; 108 108; 110 110; 111 111; 112 112; 113 113; 114114; 116116; 117117; 118113; 119119; 122122 "," S:/MSproject/swregap/swgap_RECLASS "," ДАНІ ")

Крім того, я думаю, що ваше використанняarcpy.gpє застарілим (до 10.0), тому, можливо, перегляньте перекласифікацію (просторовий аналітик), щоб побачити синтаксис, який використовується в наші дні.


Як EIT EOL на пітоні

Além disso, o python tem características diferentes das outras linguagem tais como a indentação e o uso de: ao final dos comandos.

Outra coisa é que vc vai estar comparando um int com uma str visto o que função input () retorna.

Tente isso: chute = int (input ('quanto é 2+2 ?:'))

O python não reclama sobre acento em variáveis, porém não é o mais indicado.

EOL під час сканування рядкового літералу

Ocorre quando alguma das цитати('', & quot & quot, & quot & quot & quot & quot & quot & quot) é aberta e não fechada devidamente.

ТЕСТИРУЙТЕ ОСЕМПЛОСИ АБАІКСО НІ ПЕРЕКЛАДАЙТЕ ПІТОН

AMBIENTE DO IDLE QUE CONTÉM TRÊS КУТОВІ КРОНШТЕЙНИ (& gt & gt & gt)

Se testar os exemplos abaixo todos resulttarão em erros EOL.

Se aspas simples foi aberta, a mesma deve ser fechada. Vale ressaltar que as aspas são diferentes umas das outras.

Se abrir simples, apenas aspas simples pode fechar aspas simples. E assim por diante.

E no seu caso, um & quotescape character & quot foi utilizado de maneira incoreta que é essa barra invertida com a aspa simples ( '), fazindo com que o interpretador do Python entenda que a sua aspa simples no final seja obzirrada uma aspa literal, ou seja , parte do texto, ao invés de uma цитата ou um delimitador de textos do Python. Для того, щоб вирішити цю проблему, просто скажіть простий ( '') або видаліть інверсію (').


está correta. O que acontece é que o é um caracter de escape quer dizer, quando você precisa por exemplo usar aspas sem terminar a string, você pode fazer

Assim, ele é interpretado de forma especial e ele mesmo também precisa ser escapado com . Quando se quer botar um caracter na string, é needário usar (o primeiro "escapa" o segundo e o segundo é interpretado literalmente).

O que você escreve em um arquivo novo está escapado, mas portanto resulta em escrever só um por vez. Quando o segundo arquivo é lido, só há um e ele escapa as aspas duplas de fim da string.

Для того, щоб вирішити проблему, вирішуйте проблему. Найкраще і краще, як barras no key_file.write:

E a segunda e talvez mais elegante é usar uma string bruta, ou raw, prefixando ela com r. Асим, o é tratado como um характер нормальний.


3 способи вирішення винятків

Після виявлення помилки, наступний крок - спокійно посидіти, трохи подумати і прийняти рішення про те, що ми будемо робити з винятком!

Існує 3 способи боротьби з винятками

  1. Ігноруйте виняток і перейдіть до виконання решти програми, сподіваючись, що нічого поганого не станеться. (дуже погана практика! ваша програма, швидше за все, в якийсь момент вийде з ладу або, що ще гірше, призведе до дуже несподіваних результатів!)
  2. Повторіть проблемний код, поки помилка не зникне, а потім продовжуйте решту програми. (краща альтернатива, але не у всіх ситуаціях!)
  3. Якщо замінити код неможливо, то зареєструйте помилку та завершіть програму після деякого очищення, а потім поверніться пізніше, прочитайте журнали та виправте допущені помилки! (Вам, ймовірно, доведеться робити це більшість часу, коли ви стикаєтесь з винятками!)

Давайте поглянемо на деякі приклади вищезазначених 3 стратегій і подивимося, як це працює!

Стратегія №1: Ігноруйте винятки

Подивіться на код нижче.

Тут ми просто отримуємо 2 числа від користувача, перетворюємо їх на цілі числа, додаємо і роздруковуємо результат.

Ви можете подумати, що може піти не так у такій простій програмі. Давайте ’ запустіть цей код і подивіться, що станеться.

Досить просто так!

Як би я теж хотів, щоб це було прямо! Але, на жаль! Наші користувачі сповнені холодної фантазії!

Розглянемо ситуацію нижче

Ось наш творчий користувач вирішив подарувати яблуко замість другого номера і розбився наш чудовий код!

ValueError - це назва помилки, коли інтерпретатор Python очікує побачити об’єкт одного типу, але замість цього бачить об’єкт іншого типу. У нашому випадку замість цілого числа інтерпретатор бачить поплавок!

Спробуємо слідувати Стратегії №1 і подивитися, чи зможемо ми проігнорувати цей виняток, щоб наша програма не вийшла з ладу.

Перше, що нам потрібно зробити, це помістити проблемний код всередину спробуйте пункт.

Далі нам потрібно зловити виняток у крім пункт

Тут, якщо наш користувач проявляє фантазію і намагається ввести щось випадковим чином, ми вловлюємо це і замість цього робимо значення 0!

Весь код виглядає приблизно так

Давайте знову передамо наш код уявному користувачеві! Спробуйте зламати мій код зараз!

Це круто, ми не дозволили користувачеві зламати наш код!

Для такого простого коду наша стратегія №1 працює нормально, але це не ідеальний підхід

Подумайте про не такого пустотливого користувача, який би вводив такі значення

Тепер, хоча цей користувач насправді ввів 2 числа (так, у рядковому форматі, але це значення за значенням!), Ми дали йому неправильну відповідь!

Тому замінити значення за замовчуванням і просто продовжити виконання - погана ідея і призведе до неправильних результатів.

Або збій програми, або програма, яка дала погані результати, не допоможуть вашій репутації Spock у вашій команді!

То що ж тоді робити з цим кодом? Давайте спробуємо стратегію №2!

Стратегія №2: Повторіть проблемний код, поки помилка не зникне

Тож у випадку прикладу додавання чисел ми можемо зробити щось подібне!

Спробуємо запустити цей код ще раз!

Тепер, яким би уявними не були наші пустотливі користувачі, код завжди виконуватиметься так, як очікується.

Це приклад хорошого надійного коду, який не дає збоїв і не дає неточних результатів!

Отже, Стратегія №2 Спробуйте і спробуйте ще раз, поки не виграєте ідеально працює для наших Номер партії приклад!

Але як щодо Завершити гру приклад?

Скільки б разів ми не намагалися, файл не буде виглядати магічним чином заповненим очікуваним вмістом (я не знаю про вас, але я очікував файл з усією історією третьої частини гри End, де Iron man повертається, щоб знову очолити команду!)

Тож на даний момент ми можемо зробити лише одне

Стратегія №3: Зареєструйте помилку та чисто припиніть програму

Оскільки ми не можемо виправити помилку в цьому сценарії, ми зробимо наступне найкраще.

Тут створюється файл журналу, і користувача просять надіслати вам файл журналу електронною поштою!

Запуск цього коду призведе до чогось такого

Отже, як ви бачите, коли нічого не можна зробити з винятком, найкраще, що ми можемо зробити, - це зареєструвати помилку!

Поки що ми бачили проблемний код, який може створити лише 1 тип винятку, і ми чудово обробляли ці винятки за допомогою пропозицій except.

Але що, якщо один рядок коду може створити 3 різні винятки (залежно від ситуації), і ми хотіли б мати справу з кожним з цих 3 винятків окремо?

Наступний розділ пояснює, як це можна зробити!


26 Відповіді 26

Ви говорите про багаторядкові рядки? Легко, використовуйте потрійні лапки для їх початку та закінчення.

Ви також можете використовувати одинарні лапки (3 з них, звичайно, на початку та в кінці) і обробляти отримані рядки так само, як і будь -який інший рядок.

ПРИМІТКА: Так само, як і у будь -якому рядку, усе між початковою та кінцевою лапками стає частиною рядка, тому цей приклад має провідне пробіл (на що вказує @root45). Цей рядок також буде містити пробіли та нові рядки.

Нарешті, можна також побудувати довгі рядки в Python таким чином:

який буде ні включайте будь -які додаткові пропуски або нові рядки (це навмисний приклад, який показує, до чого призведе ефект пропуску пробілів):

Коми не потрібні, просто помістіть рядки, які потрібно об’єднати, у пару дужок і обов’язково врахуйте необхідні пробіли та нові рядки.


Просто спробуйте перетворити його на int, а потім виручити, якщо це не спрацює.

Мабуть, це не спрацює для від'ємних значень, але це буде для позитивних чисел.

Метод isnumeric () виконає свою роботу (Документація для python3.x):

isnumeric () повертає True, якщо всі символи в рядку є числовими символами, і є принаймні один символ.

Тому негативні числа не приймаються.

Для Python 3 буде працювати наступне.

РЕДАКТОВАНО: Ви також можете скористатися цим кодом нижче, щоб дізнатися, чи є це число чи також мінус

Ви також можете змінити свій формат відповідно до своїх вимог. Я бачу цей пост трохи пізно. Але сподіваюся, що це допоможе іншим людям, які шукають відповіді :). дайте мені знати, якщо в даному коді щось не так.

Якщо вам особливо потрібен int або float, ви можете спробувати "is not int" або "is not float":

Якщо вам потрібно працювати лише з ints, найелегантніше рішення, яке я бачив, - це метод ".isdigit ()":

Працює нормально для перевірки, якщо введення є додатним цілим числом І в певному діапазоні

Я б рекомендував це, @karthik27, для негативних чисел

Тоді робіть все, що хочете, з цим регулярним виразом, match (), findall () тощо

найелегантнішими рішеннями були б вже запропоновані,

На жаль, це не працює як для від'ємних цілих чисел, так і для загальних значень з плаваючою величиною a. Якщо ви хочете перевірити, чи є 'a' загальним числом, що виходить за межі цілих чисел, я б запропонував наступне, яке працює для будь -якого типу з плаваючою та цілочисельною кількістю :). Ось тест:

Сподіваюся, вам це стане в нагоді :)

природний: [0, 1, 2 . ∞]

ціле число: [-∞, . -2, -1, 0, 1, 2, ∞]

плавати: [-∞, . -2, -1.0. 1, -1, -0.0. 1, 0, 0.0. 1, . 1, 1.0. 1, . ∞]

Ви можете використовувати метод isdigit () для рядків. У цьому випадку, як ви сказали, введення завжди є рядком:

Чому б не розділити вхідні дані на число? Цей спосіб працює з усім. Негативні, плаваючі та негативні плаваючі. Також порожні пробіли і нуль.

Це рішення буде приймати лише цілі числа і нічого, крім цілих чисел.

Це працює з будь -яким числом, включаючи дріб:

Я знаю, що це досить пізно, але це допоможе будь -кому іншому, кому довелося витратити 6 годин, намагаючись це зрозуміти. (це я зробив):

Це працює бездоганно: (перевіряє, чи є будь -яка буква у вході/перевіряє, чи введення є цілим чи плаваючим)

Ось проста функція, яка перевіряє введення для INT та RANGE. Тут повертає значення "True", якщо введення є цілим числом між 1-100, "False" в іншому випадку

Я використовував інший підхід, який думав поділитись. Почніть зі створення дійсного діапазону:

Тепер запитайте номер, а якщо його немає у списку, продовжуйте запитувати:

Нарешті, перетворіть на int (що буде працювати, оскільки список містить лише цілі числа як рядки:

Ось найпростіше рішення:

Це робить цикл для перевірки того, чи є введення цілим числом, результат виглядатиме так:

Якщо ви хотіли оцінити плаваючі знаки і хотіли прийняти NaN як вхідні дані, але не інші рядки, такі як 'abc', ви можете зробити наступне:

Вранці у мене також виникли проблеми з тим, що користувачі могли вводити нецілісні відповіді на мій конкретний запит на ціле число.

Це рішення, яке в кінцевому підсумку добре спрацювало для мене, щоб змусити відповідь, яку я хотів:

Я б отримав винятки, перш ніж навіть досягнути оператора try: під час використання

і користувач ввів "J" або будь-який інший неціловий символ. Найкраще було прийняти його як необроблений вхідний сигнал, перевірити, чи можна перетворити цей необроблений вхід у ціле число, а потім перетворити його.


8 Відповіді 8

Причини, що це важливо для мене:

Коли я натискаю клавішу "End", я очікую, що курсор перейде до кінця рядка (залежно від того, який редактор я використовую і як він налаштований), і я очікую, що зможу почати друкувати одразу. Якщо курсор потрапляє туди, і мені доводиться видаляти 3 або 4 символи, це дратує. Особливо, якщо воно суперечить у всьому файлі (файлах).

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

Хоча це не є суто програмуванням, пробіли можуть серйозно зіпсувати введення даних, якщо у файлі є кінцевий/ведучий, який буде проаналізовано та використаний як вхід для чогось іншого. Найчастіше це відбувається, коли чистий, згенерований вхідний файл забруднюється тим, хто редагує його в Excel або щось подібне, а потім може проникнути кінцевий пробіл (та інші проблеми форматування).

Я дуже ненавиджу закінчення пробілів, але точна причина трохи туманна.

Я припускаю, що походження цього почуття не в програмуванні, а в сфері настільного видавництва. Вам коли -небудь надрукували документ, набраний кимось іншим, який потрібно було набрати у публікації? У всіх сучасних публікаціях, особливо при використанні колонок, прийнято, щоб речення слідували один за одним у межах одного абзацу, не починаючи новий рядок для кожного речення. Що ж, коли є пробіл у кінці, потрібно багато зусиль, щоб це виправити (багато дій пошуку та заміни, які усувають подвійні пробіли тощо).

Я знаю інші причини (у програмуванні), не вагомі причини, але вони насторожують мою психіку підсвідомості настільки загострюючою інтенсивністю, що змушують мене її усунути:

  • Це займає більше місця для зберігання, ніж необхідно
  • При компіляції синтаксичному аналізатору доведеться пропустити зайвий символ без поважних причин
  • Деякі редактори можуть додати додатковий порожній рядок, коли WordWrap увімкнено, а кінцевий пробіл не підходить

Так, так, я знаю! Я знаю, це непотрібні причини. Я не перфекціоніст, але. ну може я?

Остання причина, про яку я можу згадати, - це непослідовний рух курсору. Створюється враження, що курсор висить у повітрі в кінці рядка, кожен крок праворуч може спричинити його або падіння, або зависання далі до невідомої межі, він просто відчуває себе нестійким (як ті невидимі або зникаючі блоки, які Супер Раніше Маріо стрибав).

Напевно, мені можуть поставити діагноз trailspacefobia?

Багато цих відповідей майже торкнутися причини, чому це погано для мене, але в основному: це "ламає" текстові редактори. Мій досвід роботи з vim.

Vim розроблений так, що загальні дії відображаються на літери настільки чисто, що вам навіть не потрібно думати про те, яку букву чи комбінацію клавіш натиснути. Різні гарячі клавіші дозволяють курсору пересуватися по тексту настільки швидко, що знадобиться всього кілька натискань клавіш, щоб потрапити туди, куди ви хочете. Навіть такі речі, як складання блоків коду, є швидкими, оскільки ви можете натиснути END або $, щоб перейти до кінця рядка, де курсор повинен перекривати <або> або (або) або щось таке - немає необхідності переривати потік думок до отримати ідею на екрані.

Але потім з’являється якийсь кінцевий пробіл, і рухи курсору більше не передбачувані. Ваш процес набору тексту переривається, оскільки те, що ви не бачите, впливає на те, куди рухається курсор, тому вам доведеться зламати хід думок, щоб надіслати його туди, де він повинен бути.

Ви коли -небудь помічали, як дратуються люди, коли вони дійсно зосереджені на завданні, і хтось їх перериває? Так, знайти кінцеві пробіли, коли це найменше очікується точно так як це.

Як примітка, я також помітив, що люди, яким байдуже пробіл у кінці, є тими, хто використовує мишу для навігації, і через це, як правило, повільніші друкарки.


Як щодо вмісту з непарним роздільником?

Це відповідь з двох частин. Перш за все, як уникнути обраної пари роздільника, це питання, яке хвилює нотації, а не Джулії. Наприклад, у HTML є амперсанд, що розривається, тому початковий роздільник можна записати як & amp#10218. URL-адреси використовують відсоткове кодування. Традиційний синтаксис з подвійними лапками (наприклад, " u27EA" для початкового роздільника) може бути використаний нотацією Python. Наприклад, для кодування непарного розмежувача відкриття використання цієї функції може виглядати так.

htm⟪ & lthtml & gt & ltbody & gtМи починаємо ці рядкові літерали з & ltcode & gt & amp#10218 & lt/code & gt & lt/body & gt & lt/html & gt⟫

Попросити позначення надати власний роздільник, що виходить, не є безпрецедентним. На веб -сторінках вбудований Javascript починається з & ltscript & gt і закінчується, коли синтаксичний аналізатор HTML зустрічає & lt/script & gt - без механізму виходу. Розробники Javascript, яким потрібно представити цю послідовність у своїй логіці, використовують звичайні рядки з подвійними лапками, з роздільником, кодованим як "& lt /script & gt".

Як запасний варіант для таких позначень, як @raw_str, у яких відсутні такі можливості, якщо користувач повинен включити непарний роздільник, вони могли б використовувати існуючий синтаксис необроблених рядків, який не зникне. Крім того, вони можуть бути творчими та будувати свої рядки по фрагментах, використовуючи цей синтаксис для більшості вмісту та об’єднуючись із звичайними рядками з подвійними лапками для непарного роздільника. Запропонований синтаксис має бути таким взаємодоповнюючі до існуючих підходів і представляє різний набір чутливості.


Розуміння EOL під час сканування рядкового літералу з Перекласифікації в ArcPy? - Геоінформаційні системи

Мережа Stack Exchange складається з 177 спільнот Q & ampA, включаючи Stack Overflow, найбільшу, найбільш надійну онлайн -спільноту для розробників, щоб навчатися, ділитися своїми знаннями та будувати свою кар'єру.

Нинішня спільнота

Ваших спільнот

Більше спільнот для обміну стеками

Об’єднуйтесь та діліться знаннями в одному структурованому місці, яке легко шукати.

Я люблю їсти крупу на вечерю. Вам подобається їсти крупу на вечерю? Я думаю, що омлети часто бувають ситнішими, але їм не вистачає солодощів, які можуть бути у хороших злаків. Я не говорю про матові пластівці чи щось таке дурне. Я говорю про приємну тверду гранолу. Можливо, трохи меду.

Я думаю, омлети краще на сніданок.

Ти п'єш каву? Я люблю каву!

Я також був би готовий працювати на життя. Мій профіль кар’єри тут.

Найпопулярніші повідомлення в мережі

Топові теги (9)

Найпопулярніші пости (5)

Значки (10)

Срібло

Найрідкісніший

Бронза

Найрідкісніший

дизайн сайту / логотип © 2021 Вклад користувачів Stack Exchange Inc ліцензовано згідно cc by-sa. rev 2021.6.25.39582

Натискаючи «Прийняти всі файли cookie», ви погоджуєтесь, що Stack Exchange може зберігати файли cookie на вашому пристрої та розкривати інформацію відповідно до нашої Політики щодо файлів cookie.


Словник 1.12    

а) Виконати всі обчислення та логіку програми
б) Отримати веб -сторінки через Інтернет
в) Зберігайте інформацію на тривалий період – навіть після вимкнення циклу живлення
d) Отримайте дані від користувача

а) Інтерпретатор Python
б) Клавіатура
в) вихідний файл Python
г) документ з текстової обробки

а) Центральний процесор
б) Основна пам'ять
в) Вторинна пам'ять
г) Пристрої введення
д) Вихідні пристрої

а) 43
б) 44
в) х + 1
г) Помилка, оскільки x = x + 1 неможливо математично


Подивіться відео: Reclassifying Raster Data. Shapefile creation from DEM ArcGIS Reclassify