ChatGPT для Python: как написать и проверить небольшой скрипт

В этой статье

Чтобы получить от ChatGPT полезный код на Python, задайте небольшую задачу с проверяемым результатом. Здесь прочитаем tasks.csv и посчитаем открытые задачи по исполнителям. ChatGPT помогает сформулировать условие и написать код; готовый скрипт запускает Python на вашем компьютере. Подключать OpenAI API не требуется.

Разберём готовый пример, проверенный локально на Python 3.13.0 под Windows. Нужен установленный Python 3; сторонних библиотек в скрипте нет. Ответ ChatGPT на ваш запрос может отличаться — проверяйте его по тому же условию и входному файлу.

Сначала условие, затем код

Вставьте в ChatGPT такой запрос:

Напиши небольшой скрипт для Python 3.13 без сторонних библиотек. Он читает tasks.csv из текущего каталога. В CSV три столбца с уникальными заголовками task,owner,status; каждая запись занимает одну строку, внутри поля могут быть запятые в кавычках. Посчитай задачи со статусом open по исполнителям, а done не учитывай. Каждая запись — отдельная задача, дубликаты не удаляй. Убери пробелы вокруг статуса и имени; регистр статуса не учитывай. Пустого исполнителя назови «Не назначен». Если нет нужных заголовков, заверши работу с ValueError. Неизвестный статус, лишнее или недостающее поле записи тоже должны приводить к ValueError, с номером строки. Выведи исполнителей по алфавиту и число открытых задач у каждого. Если открытых задач нет, напечатай «Нет открытых задач». Покажи полный файл report_tasks.py, пример tasks.csv и ожидаемый вывод. Разбери отдельно файл только с заголовками, совершенно пустой файл и некорректные данные.

В запросе уже есть критерии проверки: что считать, какие данные исправлять, а какие отклонять. Это следует рекомендации OpenAI давать конкретную задачу и достаточный контекст, а затем дорабатывать запрос по результату (рекомендации по составлению запросов). Для другой задачи пригодится тот же порядок: вход, правила обработки, формат результата. Подробнее об этом — в материале как написать промпт для ChatGPT.

Для такого текстового запроса достаточно бесплатного ChatGPT в пределах его лимитов (справка о бесплатном тарифе). Если вы уже выбираете платный доступ для регулярной работы с кодом, в Amber Market можно посмотреть месячную подписку ChatGPT с вариантами Go, Plus, PRO x5 и PRO x20. Покупка не входит в настройку этого скрипта: после сохранения он выполняется локально.

Два файла и один запуск

Сохраните код в файл report_tasks.py:

import csv
from collections import Counter


def count_open_tasks(path):
    counts = Counter()
    required = {"task", "owner", "status"}

    with open(path, encoding="utf-8-sig", newline="") as file:
        reader = csv.DictReader(file)

        if not required.issubset(reader.fieldnames or []):
            raise ValueError("Нужны столбцы task, owner, status")

        for line, row in enumerate(reader, start=2):
            if None in row or any(row.get(key) is None for key in required):
                raise ValueError(f"Строка {line}: неверное число полей")

            status = row["status"].strip().lower()
            if status not in {"open", "done"}:
                raise ValueError(f"Строка {line}: неизвестный статус {status!r}")

            if status == "open":
                owner = row["owner"].strip() or "Не назначен"
                counts[owner] += 1

    return counts


if __name__ == "__main__":
    counts = count_open_tasks("tasks.csv")

    if not counts:
        print("Нет открытых задач")

    for owner, count in sorted(counts.items()):
        print(f"{owner}: {count}")

Рядом создайте tasks.csv и сохраните его в UTF-8:

task,owner,status
Подготовить бриф,Анна,open
Отправить счёт,Борис,done
Проверить текст,Анна,open
Заказать зал,,open
Позвонить площадке,"Борис, смена 2",open

Откройте терминал в каталоге с обоими файлами и выполните:

python report_tasks.py

В зависимости от установки Python команда может называться python3 или py. Рабочий каталог имеет значение: путь "tasks.csv" отсчитывается от него, поэтому запускать команду нужно из папки с CSV.

Полученный при локальной проверке вывод:

Анна: 2
Борис, смена 2: 1
Не назначен: 1

В отчёте четыре открытые задачи: две у Анны, одна у Бориса из второй смены и одна без исполнителя. Задача со статусом done не попала в счётчик. Каждая запись считается отдельно: одинаковые строки тоже увеличат результат.

Зачем csv.DictReader, если есть split(",")

В последней записи у исполнителя имя Борис, смена 2. Вызов line.split(",") разрежет его на два поля, хотя кавычки обозначают одно поле CSV. Стандартный модуль csv учитывает кавычки, а DictReader сопоставляет значения с заголовками первой строки. Код получает row["status"] и row["owner"] по именам столбцов.

При открытии CSV документация Python рекомендует newline="": обработку переводов строк берёт на себя CSV-парсер. Кодировка utf-8-sig позволяет прочитать UTF-8 как с BOM, так и без него. Иначе метка BOM может оказаться частью имени первого столбца: вместо task получится \ufefftask.

Проверки в цикле различают пустое поле и недостающее. В строке Заказать зал,,open поле исполнителя существует, но содержит пустую строку — это разрешено. В строке Заказать зал,Анна не хватает поля статуса, и DictReader подставляет для него None. Лишние значения он помещает под ключ None. Оба нарушения останавливают расчёт.

Затем скрипт убирает пробелы вокруг статуса и приводит его к нижнему регистру: OPEN будет принято как open. Неизвестный статус отклоняется. Имя очищается только от пробелов по краям, поэтому Анна и анна останутся разными исполнителями.

В этом примере каждая запись занимает одну строку, без пустых строк между записями. Поэтому счётчик enumerate(..., start=2) совпадает с номером строки файла. Для CSV с переводами строк внутри кавычек такой счётчик уже нумерует записи, а не физические строки.

Проверьте не только основной пример

Сначала сравните весь вывод с приведённым выше. Затем оставьте в tasks.csv только заголовок task,owner,status: программа напечатает Нет открытых задач. Такой же результат получится, если все задачи имеют статус done.

Совершенно пустой файл ведёт себя иначе. В нём нет обязательных заголовков, поэтому скрипт завершится с ValueError: Нужны столбцы task, owner, status. Пустой список задач и файл без структуры — разные входные данные.

Теперь временно замените содержимое CSV на:

task,owner,status
Задача,Анна,waiting

В конце traceback должно быть:

ValueError: Строка 2: неизвестный статус 'waiting'

Если убрать status из заголовка, ожидается сообщение Нужны столбцы task, owner, status. Если оставить заголовки, но записать задачу как Задача,Анна или Задача,Анна,open,лишнее, ожидается Строка 2: неверное число полей.

Здесь исключение полезнее неполного отчёта. Скрипт печатает результат только после успешного чтения всего файла. Если подавить ValueError и вывести уже накопленный счётчик, часть задач исчезнет из отчёта без объяснения.

Если ваш запуск завершился неожиданным traceback, передайте ChatGPT текст исключения, минимальный CSV, команду запуска и ожидаемый результат. Уберите пароли, токены и персональные данные. Попросите объяснить причину и предложить точечное изменение. После исправления снова проверьте основной пример и тот вход, на котором произошёл сбой: исправленный код должен выполнять оба условия.

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

Источники

Есть следующая задача?Ещё по теме «Программирование» →