Я пользуюсь ChatGPT для создания скриптов на Python

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

С некоторых пор стал активно использовать ChatGPT для написания простых скриптов для автоматизации действий. Это не руководство к действию и не «волшебные промпты», лишь описываю свой опыт.

Начну с выводов (дальше статью можно не читать):

Пишите на Python

Всё просто, это языковая модель, она обучалась на образцах. Образцов чего было больше всего? Правильно, вы угадали.

Вот рейтинг знаний языков программирования, который мне составил сам ChatGPT:

Вот список языков программирования и моя оценка возможности писать на них скрипты:

Python - 10/10

JavaScript - 8/10

Java - 7/10

C++ - 7/10

C# - 6/10

Ruby - 6/10

PHP - 5/10

Swift - 4/10

Go - 4/10

Kotlin - 3/10

ChatGPT

Понятен смысл, да? Я сначала пытался писать скрипты для сортировки файлов на CMD (Batch) и это было адом. Часами объяснял, а в ответ «Простите, я ошибся, вот исправленный скрипт...» и выдавал очередную неработающую фигню.

Поэтому сегодня это желательно Python, как только стал использовать его — дела мигом наладились.

Не ставить безумных задач

Ну ребята и девчата, задача «Вот тебе $100 преврати их в $100 000 максимально быстро и законно», конечно, хайповая, но выполнена не будет. А вот «Возьми файл 1.JPG из директории 1, проверь подпапки в директории 2 и если в подпапке есть файл с именем 2.jpg скопируй его туда» будет прекрасно работать.

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

Модульность и структура

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

Можно ли написать с помощью ChatGPT большую программу? Я поковырялся некоторое время и могу сказать, что да, наверное можно. Но! Для этого надо:

  • Спланировать структуру проекта;
  • Использовать функции и методы;
  • Изучить классы и объекты;
  • Использовать модули;
  • Использовать пакеты;
  • Использовать Git;
  • Наладить тестирование.

Т.е. это уже выходит за рамки «напишу быстренько простенький скрипт» и подразумевает глубокое погружение в тему. И тут либо ты сам начинаешь становиться программистом (что не всем нужно), либо проще (и дешевле) обратиться к программистам, которые это уже умеют.

Тут есть грань между экономией времени и сил и «день потерять за час долететь». Я всегда оцениваю сколько времени потрачу на написание скрипта, работу без скрипта и изучением тематики для написания скрипта. Иногда проще руками сделать и никакие программы не писать.

Мне нравится сравнение про автомобили: в начале XX века ими управляли профессиональные шофёры, а сегодня профессия не то что бы исчезла, но есть дальнобойщики, таксисты, механики, а есть я — который машину чинить не любит, она неделями стоит, но может сесть и поехать на ней в отпуск. Потому, что это удобно. Вот со скриптами ChatGPT так же — «не хочу разбираться, дайте мне скрипт за 10 минут».

Нюансы и пошаговость

ChatGPT не умеет думать, у него есть некие связи, но нет понимания почему это так. Многое он не понимает «по умолчанию». Поэтому отмечаем нюансы:

  • Это должно быть прозрачным.
  • Используй только JPG файлы.
  • В этой папке нет подпапок.
  • Скрипт лежит в той же папке, что и файлы.

Подробнее и, ещё раз повторюсь, пошагово. Рисуйте у себя в голове процесс. Это и есть программирование. А ChatGPT просто переводчик, он ваш алгоритм переводит на известный ему язык — например Python (другие он пока знает средненько и хуже).

GPT-4 лучше чем 3.5

Да, жаба давит, но надо признать , что GPT-4 пишет код лучше чем 3.5. Причём это даже не про сам код, а про интерпретацию поставленной задачи и понимание, что нужно.

Чтобы не выбирать лимит слишком быстро я простые вопросы или объяснения спрашиваю у 3.5, а код пишет 4.

И да, всё равно они пока оба тупня, попробуйте спросить «Зачем Герасим утопил Муму?» или дайте текст в неправильной раскладке, таблицу соответствия и попросите расшифровать. Вечер веселья обеспечен.

У меня своя фишка, про «лихих пиратов»:

Я пользуюсь ChatGPT для создания скриптов на Python

Пример практической задачи

У меня есть магазинчик, там нужно было сделать витрину, это тысячи файлов и папок. Как оцениваю по времени? Около двух дней. Написание скрипта заняло примерно 2–3 часа. Причём я много понял и сейчас напишу подобный скрипт с помощью ChatGPT на порядок быстрее, примерно за 30 минут. Ну давайте уже картинки котиков покажу.

Было:

Я пользуюсь ChatGPT для создания скриптов на Python
  • Два котика, цветной и чёрно-белый, с прозрачным фоном.
  • Сотни папок, где лежат аналогичные картинки: собачки, черепашки, лошадки.
  • Фон.
  • Водяной знак.
  • Нужно поместить котиков (собачек, черепашек, лошадок etc.) на фон, масштабировать, добавить тень, положить водяной знак, переименовать файл и положить в нужную папку.

Результат:

Я пользуюсь ChatGPT для создания скриптов на Python

Сотни файлов обрабатываются за минуты. Я очень доволен.

Вот пример первоначального запроса:

Я пользуюсь ChatGPT для создания скриптов на Python

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

Ниже код (в одно окошко не влезло):

from PIL import Image import os import glob def merge_images(): resize_factor1 = 1.5 # Resize factor for special images resize_factor2 = 1.3 # Resize factor for special images resize_factor3 = 1.15 # Resize factor for special images watermark = Image.open("2.png").convert("RGBA") background = Image.open("1.jpg").convert("RGBA") subfolders = [f.path for f in os.scandir() if f.is_dir()] for subfolder in subfolders: bw_file = glob.glob(os.path.join(subfolder, "*-bw-*.png")) color_file = glob.glob(os.path.join(subfolder, "*-color-*.png")) if not bw_file or not color_file: continue # Skip if either of the files are not found files = [color_file[0], bw_file[0]] # Ensuring color image is on the left images = [] for file in files: im = Image.open(file).convert("RGBA") # Check for special numbered files and process accordingly base = os.path.basename(file) num = base.split('-')[0] if num in ['005', '007', '029', '033', '034', '035', '039', '040', '042', '043', '048', '057', '058', '061', '062', '067', '079', '082', '083', '084', '086', '088', '089', '090', '096', '097', '098', '099', '101', '112', '113', '115', '133', '138', '141', '151', '152', '154', '155', '156', '163', '164', '184']: new_size = (int(im.width * resize_factor1), int(im.height * resize_factor1)) im = im.resize(new_size) # Resize the image left = (im.width - 2000) // 2 right = (im.width + 2000) // 2 im = im.crop((left, 0, right, im.height)) # Crop the image # Check for special numbered files and process accordingly 2 base = os.path.basename(file) num = base.split('-')[0] if num in ['038','049','051','063','072','073','076','077','078','080','119','121','127','128','150','153','157','168','172']: new_size = (int(im.width * resize_factor2), int(im.height * resize_factor2)) im = im.resize(new_size) # Resize the image left = (im.width - 2000) // 2 right = (im.width + 2000) // 2 im = im.crop((left, 0, right, im.height)) # Crop the image # Check for special numbered files and process accordingly 3 base = os.path.basename(file) num = base.split('-')[0] if num in ['144','145','147']: new_size = (int(im.width * resize_factor3), int(im.height * resize_factor3)) im = im.resize(new_size) # Resize the image left = (im.width - 2000) // 2 right = (im.width + 2000) // 2 im = im.crop((left, 0, right, im.height)) # Crop the image images.append(im) widths, heights = zip(*(i.size for i in images)) total_width = sum(widths) max_height = max(heights) new_img = Image.new('RGBA', (total_width, max_height)) x_offset = 0 for img in images: y_offset = (max_height - img.height) // 2 new_img.paste(img, (x_offset, y_offset)) x_offset += img.width # Resize the merged image new_img = new_img.resize((2000, int(2000 * new_img.height / new_img.width))) # Crop the image to 2000x1500 top = (new_img.height - 1500) // 2 bottom = (new_img.height + 1500) // 2 new_img = new_img.crop((0, top, 2000, bottom)) # Apply shadow effect new_img = shadow(new_img, 0.65, 21, 25, 0.9) # Paste the new image onto the background bg_copy = background.copy() bg_copy.paste(new_img, (bg_copy.width // 2 - new_img.width // 2, bg_copy.height // 2 - new_img.height // 2), new_img) # Apply the watermark bg_copy.paste(watermark, (0, 0), watermark) # Save the image with a new name new_name = color_file[0].replace("Photo-", "Photo-2-1-").replace(".png", ".jpg") bg_copy.convert("RGB").save(new_name, "JPEG", quality=85) merge_images()

Тень:

from math import cos, sin from PIL import ImageEnhance, ImageFilter def shadow(image, opacity, radius, offset, angle): # Create the shadow image, same size as the input Image shadow = Image.new('RGBA', image.size, color=(0,0,0,0)) # Create a shadow mask with alpha channel only shadow_mask = image.filter(ImageFilter.GaussianBlur(radius)).split()[3] # Offset the shadow mask shadow_offset = shadow_mask.transform(shadow.size, Image.AFFINE, (1,0,-offset*cos(angle), 0,1,-offset*sin(angle))) # Paste the shadow mask into alpha channel of the shadow shadow.putalpha(shadow_offset) # Enhance (darken) the shadow enhancer = ImageEnhance.Brightness(shadow) shadow = enhancer.enhance(opacity) # Create a new image for the final result final = Image.new('RGBA', image.size, color=(0,0,0,0)) # Paste the shadow onto the final image final.paste(shadow, (0,0), shadow) # Paste the original image onto the final image final.paste(image, (0, 0), image) return final

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

Далее мне понадобилось рассортировать полученные изображения по папкам товаров, этот скрипт был написан менее чем за минуту и заработал с первой попытки:

Я пользуюсь ChatGPT для создания скриптов на Python
import os import shutil def find_files_with_substring(folder, substring): found_files = [] for root, _, files in os.walk(folder): for file in files: if substring in file and file.endswith(".jpg"): found_files.append(os.path.join(root, file)) return found_files def main(): folder1 = "1" folder2 = "2" files_photo_2_1 = find_files_with_substring(folder1, "Photo-2-1") files_photo_2 = find_files_with_substring(folder2, "Photo-2") for file_2_1 in files_photo_2_1: file_name_2_1 = os.path.basename(file_2_1) file_name_2 = file_name_2_1.replace("Photo-2-1", "Photo-2") for file_2 in files_photo_2: if os.path.basename(file_2) == file_name_2: destination_folder = os.path.dirname(file_2) shutil.copy(file_2_1, destination_folder) break if __name__ == "__main__": main()

Возражения, придирки, оговорки

  • Я не программист и не хочу им быть. Меня всё устраивает. Мне нравится и интересно программирование, но изучение это слишком много времени. Или посвящай всю жизнь, или ничего не пиши. Вот тут мы видим третий путь — я могу писать простенькие скрипты, которые экономят кучу времени и не требуют погружения.
  • «Твой код не PEP8! 🤬» — мне вообще без разницы как он выглядит, работает и зашибись.
  • «Можно взять плагин Photoshop и сделать то же самое» — нельзя, к сожалению. Нет такого плагина, который:

    1. Выбирает два файла по имени.
    2. По вхождению в имя ставит один файл слева.
    3. Избранные по имени файлы добавляет в исключения и обрабатывает иначе.

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

Итоги и взгляд в будущее

За пару месяцев написал штук 20 утилитарных скриптов, которые значительно облегчили мне жизнь. В основном это обработка рутинных операций с большим количеством файлов, сортировки, исправление изображений. Очень много времени сэкономил, а, главное, душевных сил: знаете как мерзко, когда два дня сидишь и однообразные картинки правишь. И ведь не делегируешь — объяснять дольше чем самому делать.

Очень доволен. 😊

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

Чисто для собственного удовольствия планирую написать скриптик, который будет работать на Cloudflare Workers с интерфейсом на Cloudflare Pages и разбанивать людей, которых я забанил в Твиттере по запросу.

Относительно ChatGPT, мне кажется, что сейчас люди ещё не поняли всю мощь языковых моделей и куда его можно применять:

  • Сайты, которые автоматически переводятся на десятки языков «на лету».
  • Игры, где процесс перевода на три десятка языков занимает минуты и стоит копейки.
  • Написание текстов для карточек товаров, подбор ключей для магазинов (это делается потихоньку, но пока зачаточное).
  • Предварительная классификация и отбор текстов, сайтов, страниц, предметов и вообще составление любых списков и каталогов — огромнейшая отрасль с миллиардами.
  • Перевод «на лету» в оффлайне.

Думаю, что в течении ближайших лет 10 мы многое увидим.

А вот мой блог: «Злая Печенька», он вообще не про это, но если я такую статью написал, то представляете сколько там ещё полезного?

Ну и чатик: «Печенькочат», это для избранной элиты.

100100
127 комментариев

“Я не программист и Python не знаю”.
Почитав статью, для 90% людей вы именно программист и есть😂

18
Ответить

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

Это легко поправить, но это время и изменение образа жизни. В программирование нельзя вкатиться на «полшишечки».

4
Ответить

Осталось научить читать его спецификации API и фигачить сервисы на их основе, и всё будет ваще зашибись.

4
Ответить

Ну вот сейчас они делают плагины и один из них это доступ к интернет. Можно будет скармливать документацию по API (надеюсь).

1
Ответить

В этом нет проблем, оплачиваешь OpenAI API, быстренько накидываешь скрипт на питоне который векторзирует спецификации твоего API (о котором реальный chat gpt не знает). И задаёшь по нему вопросы, просишь написать код. Делов на часик

Ответить

Понятный хрен на питоне такое проще всего сделать, для "одноразовых" скриптов он идеален. Но везде есть свои плюсы и минусы. Например на питоне полноценное настольные приложение с графическим интерфейсом сделать это лютый геморрой и извращение. А вот на Яве как два пальца об асфальт. )

3
Ответить

Десктопное приложение на яве тоже извращение

5
Ответить