Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: ilkant - 08.10.25 - klo:13.14
-
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ä.
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:
Yhteensä:
Koodirivejä: 290109
Kommenttirivejä: 167012
Yhteensä (molemmat): 457121
Tästä voisi kehitellä vielä lisää analytiikkaa, jos haluaa...
-
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.
-
Tässä on uudempi versio, joka ottaa vain siinä hakemistossa olevat python-ohjelmat. Aiempi ottaa myös alihakemistot. Huomasin niissä paljon kirjastopaketteja yms.
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:
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 .