В этой статье
Чтобы получить от 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.
Источники
- Prompt engineering best practices for ChatGPTOpenAI
- ChatGPT Free Tier FAQOpenAI
- csv — CSV File Reading and WritingPython Software Foundation