Kirjoittaja Aihe: Ohjelmointiprojektin rivien määrän laskeminen [ratkaistu]  (Luettu 101 kertaa)

ilkant

  • Käyttäjä
  • Viestejä: 1605
  • Kubuntu
    • Profiili
Tekoäly teki minulle python-ohjelman, joka laskee yhden projektin python-koodirivien määrän. Tällä voi katsoa hiukan, miten laaja projekti kysymyksessä on. Aloitin 8 vuotta sitten Pythonin opettelun yhdellä genetiikan ohjelmiston kehittämisellä. Sitten projekti keskeytyi ulkoisista syistä. Yritin jatkaa sitä 4 vuotta sitten. Mutta ei oiekin into syttynyt. Nyt tekoälyllä tein sen projektin merkkipohjaisesta toimintavalikoista KDE Qt6 ohjlmen. Sen käyttöliittymän se osasikin tehdä graafisena ihan mukiinmenevällä tavalla. Innostuin sitten koodaamaan lisää. Ja tavoite on saada siitä toimiva ohjelma.

Tiedän yhden genetiikan firman, joka on sanonut käyttävänsä tekoälyä pyhologeneettisen puun rakentamiseen. Ehkä toinen firma käyttää myös. Ja minäkin voisin ratkaista tuon oman ohejlmani ydintoiminnot tekoälyavusteisesti.

Tässä on python-ohjelma, joka laskee projektin python-koodirivien määrän. Se osaa eritellä kommenttirivit erikseen. Ja ei ota huomioon tyhjiä rivejä.

Koodia: [Valitse]
import os

def laske_python_rivit(hakemisto):
    yhteensa_koodi = 0
    yhteensa_kommentit = 0

    for polku, _, tiedostot in os.walk(hakemisto):
        for tiedosto in tiedostot:
            if tiedosto.endswith(".py"):
                tiedoston_polku = os.path.join(polku, tiedosto)
                try:
                    with open(tiedoston_polku, 'r', encoding='utf-8') as f:
                        rivit = f.readlines()

                        koodi_rivit = 0
                        kommentti_rivit = 0
                        monirivi_kommentti = False

                        for rivi in rivit:
                            teksti = rivi.strip()

                            # Ohita tyhjät rivit
                            if not teksti:
                                continue

                            # Tarkista monirivinen kommentti (""" tai ''')
                            if teksti.startswith(("'''", '"""')):
                                if teksti.count("'''") == 2 or teksti.count('"""') == 2:
                                    # Yhdellä rivillä alkava ja loppuva kommentti
                                    kommentti_rivit += 1
                                else:
                                    # Aloitetaan tai lopetetaan monirivinen kommentti
                                    monirivi_kommentti = not monirivi_kommentti
                                    kommentti_rivit += 1
                                continue

                            if monirivi_kommentti:
                                kommentti_rivit += 1
                                continue

                            # Yksirivinen kommentti
                            if teksti.startswith("#"):
                                kommentti_rivit += 1
                            else:
                                koodi_rivit += 1

                        yhteensa_koodi += koodi_rivit
                        yhteensa_kommentit += kommentti_rivit

                        print(f"{tiedosto}: {koodi_rivit} koodiriviä, {kommentti_rivit} kommenttiriviä")

                except Exception as e:
                    print(f"Virhe tiedoston {tiedoston_polku} käsittelyssä: {e}")

    print(f"\nYhteensä:")
    print(f"  Koodirivejä: {yhteensa_koodi}")
    print(f"  Kommenttirivejä: {yhteensa_kommentit}")
    print(f"  Yhteensä (molemmat): {yhteensa_koodi + yhteensa_kommentit}")
    return yhteensa_koodi, yhteensa_kommentit


if __name__ == "__main__":
    hakemisto = input("Anna hakemiston polku: ").strip()
    laske_python_rivit(hakemisto)

Ja tässä on koeajo:

Koodia: [Valitse]
Yhteensä:
  Koodirivejä: 290109
  Kommenttirivejä: 167012
  Yhteensä (molemmat): 457121

Tästä voisi kehitellä vielä lisää analytiikkaa, jos haluaa...
« Viimeksi muokattu: 08.10.25 - klo:13.34 kirjoittanut ilkant »

ilkant

  • Käyttäjä
  • Viestejä: 1605
  • Kubuntu
    • Profiili
Vs: Python-projektin rivien määrän laskeminen
« Vastaus #1 : 08.10.25 - klo:13.18 »
Tätä voi soveltaa muiden kielien projekteihin myös. Ja tekoälyltä voi pyytää sen muun kielisen ohjelman luomista, jos pythonia ei ole käytössä. Tuo os.walk mahdollistaa myös alihakemistojen läpikäynnin.

ilkant

  • Käyttäjä
  • Viestejä: 1605
  • Kubuntu
    • Profiili
Tässä on uudempi versio, joka ottaa vain siinä hakemistossa olevat python-ohjelmat. Aiempi ottaa myös alihakemistot. Huomasin niissä paljon kirjastopaketteja yms.

Koodia: [Valitse]
import os

def laske_python_rivit(hakemisto):
    yhteensa_koodi = 0
    yhteensa_kommentit = 0

    # Käydään läpi vain annetun hakemiston tiedostot, ei alihakemistoja
    for tiedosto in os.listdir(hakemisto):
        if tiedosto.endswith(".py"):
            tiedoston_polku = os.path.join(hakemisto, tiedosto)
            if not os.path.isfile(tiedoston_polku):
                continue

            try:
                with open(tiedoston_polku, 'r', encoding='utf-8') as f:
                    rivit = f.readlines()

                    koodi_rivit = 0
                    kommentti_rivit = 0
                    monirivi_kommentti = False

                    for rivi in rivit:
                        teksti = rivi.strip()

                        # Ohita tyhjät rivit
                        if not teksti:
                            continue

                        # Tarkista moniriviset kommentit (''' ... ''')
                        if teksti.startswith("'''") and teksti.endswith("'''") and len(teksti) > 6:
                            # yhdellä rivillä alkava ja loppuva monirivinen kommentti
                            kommentti_rivit += 1
                            continue
                        elif teksti.startswith("'''") and not monirivi_kommentti:
                            monirivi_kommentti = True
                            kommentti_rivit += 1
                            continue
                        elif teksti.endswith("'''") and monirivi_kommentti:
                            monirivi_kommentti = False
                            kommentti_rivit += 1
                            continue
                        elif monirivi_kommentti:
                            kommentti_rivit += 1
                            continue

                        # Yksiriviset kommentit
                        if teksti.startswith("#"):
                            kommentti_rivit += 1
                        else:
                            koodi_rivit += 1

                    yhteensa_koodi += koodi_rivit
                    yhteensa_kommentit += kommentti_rivit

                    print(f"{tiedosto}: {koodi_rivit} koodiriviä, {kommentti_rivit} kommenttiriviä")

            except Exception as e:
                print(f"Virhe tiedoston {tiedoston_polku} käsittelyssä: {e}")

    print(f"\nYhteensä kaikissa tiedostoissa:")
    print(f"  Koodirivejä: {yhteensa_koodi}")
    print(f"  Kommenttirivejä (myös moniriviset): {yhteensa_kommentit}")
    print(f"  Yhteensä: {yhteensa_koodi + yhteensa_kommentit}")
    return yhteensa_koodi, yhteensa_kommentit


if __name__ == "__main__":
    hakemisto = input("Anna hakemiston polku: ").strip()
    laske_python_rivit(hakemisto)

Esimerkkiajo:
Koodia: [Valitse]
Yhteensä kaikissa tiedostoissa:
  Koodirivejä: 1598
  Kommenttirivejä (myös moniriviset): 221
  Yhteensä: 1819

Tämä jättää pois myös ''' alkuiset kommentit. Jätin tuon aiemman vielä näkyviin, jos joku haluaa sellaista käyttää. Siinä on os.listdir:in sijaan os.walk .
« Viimeksi muokattu: 08.10.25 - klo:14.06 kirjoittanut ilkant »