Z pomocą czata GPT-4 bez umiejętności programowania stworzyłem ten kod

Nie umiem kodować, ale z pomocą czata GPT-4, w ok 8h „napisałem” prosty kod w Pythonie. Kod działa!

– W tym wpisie opowiem, jak człowiek, który nie ma pojęcia o kodowaniu z pomocą czata GPT-4 jednak stworzył kod – prosty programik do przetwarzania plików.

– Nie wydałem ani złotówki, ale udało mi się osiągnąć oczekiwany efekt za darmo.  

Wszystko się wzięło stąd, że jestem bałaganiarzem. Chciałem mieć bazę tekstów swojego bloga, ale ciągle zapominam, żeby wszystkie teksty najpierw pisać na komputerze a dopiero potem wrzucać do internetu. Po prawie trzech miesiącach działania bloga ściągnąłem więc kopię bloga z serwera. Kłopot tylko w tym, że kopia to plik XML. Zawiera za dużo danych, niektóre wrażliwe i nie mogę w sumie nic z tym zrobić. Tak wygląda jego fragment:

Gdybym zamiast dłubać po prostu przysiadł i skopiował ręcznie te wpisy do Worda, to już bym je miał, ale przekornie postanowiłem się nie poddawać. Wtedy czat GPT-4 zaproponował, że może napisać skrypt w Pythonie.

Skoro nie umiem nic kodować i nigdy tego nie robiłem, więc nie mam pojęcia, że to trudne i jak długo ludzie się muszą tego uczyć. Radośnie powiedziałem, żeby napisał. Nie wiedziałem, że zje mi to dwa dni z hakiem.

Kolejność moich działań była taka.
1. Otworzyłem lekcję Wprowadzenie do języka Python w Visual Studio Code – Training | Microsoft Learn i rozwiązując kilkuminutowe mini-lekcje zainstalowałem Visual Studio Code. Pythona miałem już zainstalowanego i ściągałem go z Python Release Python 3.11.0 | Python.org
2. Dzięki temu rozumiałem, że pisanie kodu w Visual Studio Code będzie prostsze niż w zwykłym Notatniku.
3. Poprosiłem czata GPT-4 o napisanie kodu, który wydłubałby z pliku XML następujące dane: data wpisu, tytuł wpisu, kategoria i tag wpisu i treść wpisu i żeby te dane przerzucił do pliku .xlxs do Excela. GPT-4 od razu napisał, ale tu zonk. Powstał pusty plik, bez danych. Wklejałem mu dane z pliku XML, ale nie umiał się tego nauczyć tylko podkreślał, że robi przykładowy kod, który nie musi działać. Tak się bawiliśmy cały wieczór.
4. Następnego dnia pomyślałem, żeby darować sobie pliki Excela, bo ja potrzebuję czegoś prostszego. Może plik txt? Czat GPT-4 znowu powiedział, że skoro nie zna drzewa pliku XML (czyli kolejności w jakiej wymienione są cechy każdego wpisu), to jego kod może się nie udać. Zacząłem wczytywać się w plik XML. Na moje oko laika miał logiczną strukturę, jakby drzewka, gdzie poszczególne cechy wpisu uporządkowane są wg zasady: od ogólnych, do szczegółowych.
5. Kod napisany przez GPT-4 znowu nie zadziałał. Stworzył pusty plik. Ja tymczasem zacząłem podejrzewać, że chodzi o źle opisane kategorie i tagi, ale nie umiałem wyjść z tej pułapki.
6. Następnego dnia przepisałem kod do Visual Studio i przyjrzałem się temu, jak były opisane kategorie i tagi. Wpisałem te kategorie raz jeszcze, ale inaczej niż proponował czat GPT-4. Nagle kod zaczął działać. Albo zadziałała moja poprawka, albo poprawki wywołane użyciem defaultowych komend używanych przez Visual Studio (w paru miejscach się różniły od komend czata GPT-4).

7. Powstał plik (juhu!), który dalej wymagał poprawek: miał za dużo różnych dat a kategorie i tagi choć były, to niestety na samym dole textu, nieprzypisane do konkretnych wpisów. Brakowało też treści wpisów.
8. Jeszcze raz przeczytałem plik XML a potem zdecydowałem się użyć innej daty – zamiast daty publikacji użyłem daty wpisu. Zobaczyłem też, że robię błąd używając tagów <p>, </p> na określenie wpisu.
Wkleiłem do czata drzewo jednego wpisu i mój prompt wyglądał tak:

Zapoznaj się z tym drzewem i na jego podstawie popraw skrypt tak, żeby z każdego kolejnego wpisu o takiej strukturze, do pliku txt zapisywane były w tej kolejności:
1. Data wpisu, opatrzona tagami <wp:post_date> i </wp:post_date>
2. Tytuł wpisu, opatrzony tagami <title> i </title>
3. Wszystkie kategorie wpisu, które znajdują się w ostatnim cudzysłowie, na końcu ciągu, w kolejnych nawiasach o tej strukturze budowy: <category domain=”category” nicename=”Tu znajdują się kategorie, których szukamy”>
4. Wszystkie tagi wpisu, które znajdują się w ostatnim cudzysłowie, na końcu ciągu, w kolejnych nawiasach o tej strukturze budowy: <category domain=”post_tag” nicename=” Tu znajdują się tagi, których szukamy”>
5. Treść wpisu, opatrzona tagami <content_encoded> i </content_encoded>

Kolejne wpisy niech będą w tekście uporządkowane rosnąco pod względem daty. Czy potrzebujesz jakiejś informacji do napisania skryptu?

8. Odpaliłem kod w konsoli Pythona i voila! Działa. Do wybranego folderu wygenerował się plik tekstowy z wydłubanymi danymi z pliku XML.

Zajęło mi to trzy sesje x 2,5h. Na ostatniej prostej, to była praca ok 1,5 h. Zgaduję, że doświadczona osoba całość zrobi to w 5-10 minut max.

To ten kod. Będę wdzięczny za uwagi. Nie rozumiem, co się stało, ale się stało.

# kod poprawiony o przyporządkowanie KATEGORIA: i TAG: do każdego wpisu <item>, między Title: a Content:
from bs4 import BeautifulSoup
from operator import itemgetter

input_path = r"C:\\Users\\NAZWAUSERA\\AppData\\Local\\Programs\\Python\\Python311\\nowastronasi.xml"
output_path = r"C:\\Users\\NAZWAUSERA\\AppData\\Local\\Programs\\Python\\Python311\\nowastronasi.txt"

with open(input_path, 'r', encoding='utf-8') as file:
    content = file.read()

soup = BeautifulSoup(content, 'lxml-xml') 

items = []
for item in soup.findAll('item'):
    post_date = item.find('wp:post_date').text
    title = item.find('title').text
    content = item.find('content:encoded').string

    categories = [tag.get("nicename") for tag in item.find_all('category', {'domain': 'category'})]
    tags = [tag.get("nicename") for tag in item.find_all('category', {'domain': 'post_tag'})]
    
    items.append((post_date, title, categories, tags, content))

# Sortowanie wpisów względem daty
items.sort(key=itemgetter(0))

with open(output_path, 'w', encoding='utf-8') as file:
    for post_date, title, categories, tags, content in items:
        file.write(f'Date: {post_date}\n')
        file.write(f'Title: {title}\n')

        for category in categories:
            file.write(f'KATEGORIA: {category}\n')

        for tag in tags:
            file.write(f'TAG: {tag}\n')

        file.write(f'Content: {content}\n\n')


Prawdę mówiąc, nie jestem pewien, czy cokolwiek sam coś zrobiłem, czy tylko przestałem przeszkadzać czatowi w pracy. A może chodzi o to, że ostatnie polecenie dla czata wreszcie było w miarę jasne? Ślepej i łysej kurze trafiło się ziarno? Zapewne.

W kolejnych krokach będę poprawiał kod tak, żeby powstała tabela zamiast pliku txt. Mile widziane komentarze od osób umiejących kodować.

Jeśli podoba Ci się ten wpis, to proszę kliknij i zalajkuj go.