Izdelek: Mini Raziskovalec Datotek

Moj izdelek je aplikacija v jeziku Python, ki uporabniku omogoča upravljanje, kopiranje in samodejno razvrščanje datotek.

Izvorna koda programa


                        # =================================================================
# Mini raziskovalec datotek
# ================================================================

import os       # Za delo z datotekami in mapami
import shutil   # Za kopiranje, premikanje in brisanje map
import time     # Da program ne teče prehitro

# -----------------------------------------------------------------
def prikazi_uvod():
    print("\n**************************************************")
    print(" MINI RAZISKOVALEC             ")
    print(" Vnesite pot in začnite urejati.         ")
    print("**************************************************\n")

# -----------------------------------------------------------------
# IZPIS DATOTEK IN MAP
# -----------------------------------------------------------------
def izpisi_datoteke(trenutna_pot):
    print("\n--------------------------------------------------")
    print("TRENUTNA LOKACIJA:", trenutna_pot)
    print("--------------------------------------------------")

    try: #poskuša prebrati vsebino v mapi  
        vsebina = os.listdir(trenutna_pot) #os.listdir vrne seznam vseh datotek in map v trenutni poti  
        #os je vgrajena knjižnica za delo z datotekami, listdir pa ukaz znotraj knjižnice, ki pogleda v mapo in vrne seznam datotek in map
    except:  #če ne more prebrati vsebine vrne to:
        print("NAPAKA: Pot ni dostopna ali ne obstaja!") 
        return [] #vrne prazen seznam, če bi vrnila None potem bi dobil TypeError

    if not vsebina: #če je mapa prazna lahko takoj zaključimo in ne potrebujemo zanke for
        print("Mapa je prazna.")
        return []
    
    # gre čez seznam datotek in jih oštevilči ter izpiše
    i = 0
    for ime in vsebina:  #z zanko se sprehodimo čez vsebino torej datoteke in ime je spremenljivka ki dobi ime naslednje datoteke iz seznama vsebina
        polna_pot = os.path.join(trenutna_pot, ime) #to da pot mape in ime datoteke skupaj
        if os.path.isdir(polna_pot): #os.path.isdir preveri ali je polna_pot mapa
            tip = "[MAPA]"
        else:          #če ni mapa je datoteka
            tip = "[DAT]" 
        print(i, ":", tip, ime)
        i = i + 1
        
    print("--------------------------------------------------")
    return vsebina

# -----------------------------------------------------------------
# KOPIRANJE IN PREMIKANJE
# -----------------------------------------------------------------
def upravljaj_datoteko(pot, seznam, akcija):
    print() # Prazen prostor za preglednost
    print("---", akcija.upper(), "---") #spremeni male tiskane v velike tiskane
    vnos_indeks = input("Vpiši številko datoteke (ali 'N' za NAZAJ): ")
    
    if vnos_indeks.lower() == 'n':  #če pritisneš N se funkcija zaključi in sevrne nazaj na glavni meni
        return

    if vnos_indeks.isdigit(): #preveeri ali je vnos res številka
        indeks = int(vnos_indeks) #spremeni vpisano število v integer da lahko uporabimo kot indeks v seznamu
        if indeks >= len(seznam): #če je vnesena številka večja kot zadnji indeks na seznamu vrne napako
            print("Napaka: Številka ni na seznamu!")
            return
    else:   #če ni številka vrne napako
        print("Napaka: Vpisati moraš številko!")
        return

    izbrano_ime = seznam[indeks] #iz seznama vzame ime datoteke ali mape na mestu vpisane številke
    print("Izbrali ste datoteko:", izbrano_ime) 
    cilj = input("Vnesi ciljno pot (ali 'N' za nazaj): ") #vnesemo cilno pot kamor želimo premakniti/kopirati
    
    if cilj.lower() == 'n': #preveri če je uporabnik vpisal n, dela pa tudi N (zato lower) 
        return

    stara_pot = os.path.join(pot, izbrano_ime) #združi naslov trenutne mape in ime izbrane datoteke v eno celotno pot
    nova_pot = os.path.join(cilj, izbrano_ime) #združi naslov ciljne mape in ime datoteke, da se ve, kam jo je treba kopirati
    
    if os.path.exists(cilj): #preveri če mapa v katero želimo kopirati/premakniti sploh obstaja, če ne vrne napako
        if akcija == "kopiraj":
            shutil.copy(stara_pot, nova_pot) #shutil.copy kopira datoteko iz stare_pot v nova_pot
        else:
            shutil.move(stara_pot, nova_pot) #shutil.move premakne datoteko iz stare_pot v nova_pot
        print("Uspešno izvedeno!")
    else:
        print("Napaka: Ciljna pot ne obstaja!")

# -----------------------------------------------------------------
#SAMODEJNO RAZVRŠČANJE
# -----------------------------------------------------------------
def samodejno_razvrsti(pot):
    print("\nRazvrščam datoteke v podmape...")
    vsebina = os.listdir(pot) #dobimo seznam datotek in map v trenutni mapi
    
    for ime in vsebina:
        polna = os.path.join(pot, ime)  #združi v polno pot
        if os.path.isdir(polna): continue  #če je mapa jo preskoči, saj obdeluje le datoteke
        
        # pridobimo končnico (npr .jpg)
        koncnica = os.path.splitext(ime)[1].lower()
        
        mapa = "" #ustvari prazno spremenljivko, v katero se potem shrani ime podmape glede na vrsto datoteke
        if koncnica in [".jpg", ".png", ".jpeg"]: mapa = "SLIKE"
        elif koncnica in [".pdf", ".docx", ".txt", ".doc"]: mapa = "DOKUMENTI"
        elif koncnica in [".mp4", ".mov", ".avi"]: mapa = "VIDEO"
        
        if mapa != "": #če je mapa že določena, in če datoteka spada v eno od kategorij, potem se premakne v ustrezno mapo
            pot_mape = os.path.join(pot, mapa) #sestavi pot do podmape npr. trenutna_pot/SLIKE
            if not os.path.exists(pot_mape): #preveri ali ta podmapa že obstaja, če ne jo ustvari
                os.mkdir(pot_mape)
            shutil.move(polna, os.path.join(pot_mape, ime)) #premakne datoteko iz trenutne mape v pravo podmapo
    
    print("Razvrščanje končano!")

# -----------------------------------------------------------------
# PROGRAM zagon in meni
# -----------------------------------------------------------------
def glavni_program():
    prikazi_uvod() #prikliče funkcijo ki prikaže uvodni napis
    
    moja_pot = "" #pripravi prazno spremelnljivko v kateri bo lokacija mape
    while moja_pot == "": #zanka se ponavlja dokler uporabnik ne vnese veljavne poti
        vnos_poti = input("Vpiši pot do mape, ki jo želiš upravljati: ")
        
        # Preverimo, če vnesena pot sploh obstaja na računalniku
        if os.path.exists(vnos_poti):
            moja_pot = vnos_poti
            print("Pot uspešno sprejeta!")
        else:
            print("NAPAKA: Ta pot ne obstaja. Poskusi ponovno.") #in še enkrat vpišemo pot

    # Glavna zanka programa
    while True: #zanka, da se program po vsakem ukazu vrne na glavni meni
        seznam_datotek = izpisi_datoteke(moja_pot) #pokliče fun. za pregled mape in shrani imena datotek v seznam
        
        #glavni meni
        print("\nGLAVNI MENI:")
        print("1 - Kopiraj")
        print("2 - Premakni")
        print("3 - Samodejno razvrsti mapo")
        print("4 - Spremeni trenutno mapo")
        print("5 - IZHOD")
        
        izbira = input("\nIzberi možnost: ") #shrani vneseno številko v izbira
        
        if izbira == "1":  #če je uporabnik izbral možnost 1, pokliče funkcijo za kopiranje datoteke
            upravljaj_datoteko(moja_pot, seznam_datotek, "kopiraj")
        elif izbira == "2":
            upravljaj_datoteko(moja_pot, seznam_datotek, "premakni") #funkcija za premikanje
        elif izbira == "3":
            samodejno_razvrsti(moja_pot) #funkcija za razvrščanje datotek v podmape
        elif izbira == "4":
            nova = input("Vnesi novo pot (ali 'n' za NAZAJ): ") #če želiš vnesti novo pot
            if nova.lower() != 'n' and os.path.exists(nova): #preveri, da uporabnik ni želel nazaj in če nova pot obstaja
                moja_pot = nova
        elif izbira == "5": 
            print("Zapiram program. Nasvidenje!") #izhod iz programa
            break
        else:
            print("Neveljavna izbira!") #katera druga številka kot 1-5 vrne napako
        
        # Program malce počaka da uporabnik lažje prebere kar napiše program, preden se vrne na glavni meni
        time.sleep(1)

# Zagon programa
glavni_program()