import sys """ Program liczący znaki w pliku i rysujący histogram """ def zlicz(sciezka,alfa=False,case_sens=True): plik = open(sciezka, 'r') katalog = {} for linia in plik: for litera in linia: if litera.isalpha() or not alfa: #Czy ma się ograniczyć do samych liter? if not case_sens: litera=litera.upper() #Czy ma rozróżniać wielkie i małe? katalog[litera]=katalog.get(litera,0) + 1 plik.close() return katalog def rozklad(slownik,szer=10,marker="#",revsort=True): sortowane=[] for i in slownik.items(): sortowane.append([i[1],i[0]]) sortowane.sort(reverse=True) #Sortujemy od najliczniejszego do najmniej licznego maxl=sortowane[0][0] #Liczność najczęściej występującego znaku if not revsort: sortowane.reverse() #Gdyby ktoś chciał od najmniej licznego for i in sortowane: n=i[0]*szer//maxl znak=i[1] if i[1]!= '\n' else "\\n" #Żeby nie łamało linii, tylko wypisywało "\n" print("{:2}: {:{szer}} {}".format(znak,n*marker,i[0],szer=szer)) argumenty=sys.argv nargs=len(argumenty) #Obróbka parametrów podanych przez użytkownika przy wywołaniu z linii poleceń if nargs==1: #Jeśli brak argumentów poza samą nazwą programu argumenty.append("-h") #Potraktuj to jako wołanie o pomoc nargs=2 alfa=False #Domyślnie bada wszystkie znaki, nie tylko litery case_sens=True #Domyślnie rozróżnia wielkie i małe litery szer=20 #Domyślna szerokość histogramu mrkr="#" #Domyślny znak użyty w histogramie revsort=True #Domyślnie sortuje od największego do najmniejszego a=1 pliki=[] while a<=nargs-1: #Pętla po argumentach programu if argumenty[a] == "-h": #Wyświetl pomoc print(" Literozliczacz 3.1415 by Trurl\n" " czestosc.py [opcje] plik [plik2 ... ]\n" "\n" " Opcje:\n" " -h : wyświetla tę informację i kończy program\n" " -s N: szerokość histogramu N pól (20 domyślnie)\n" " -a : ogranicz do liter\n" " -c : nie rozróżniaj wielkości liter\n" " -m : marker histogramu (domyślnie #)\n" " -r : odwróć sortowanie (domyślnie od największych)") sys.exit() elif argumenty[a] == "-a": alfa=True elif argumenty[a] == "-s": szer = int(argumenty[a+1]) a+=1 elif argumenty[a] == "-m": mrkr = argumenty[a+1] a+=1 elif argumenty[a] == "-c": case_sens=False elif argumenty[a] == "-r": revsort=False else: pliki.append(argumenty[a]) a+=1 for plik in pliki: print("Rozkład dla pliku: "+plik+":") rozklad(zlicz(plik,alfa,case_sens),szer,mrkr,revsort) print((szer+10)*"-")