Python - Rad s tekstualnim fajlovima


U ovoj lekciji rad s tekstualnim fajlovima ilustruje se kratkim programom koji ustanovljava ukupni broj pojavljivanja različitih slova abecede u zadanom fajlu i programom za konverzije valuta, koji koristi JSON format podataka.



Brojanje različitih slova u tekstu fajla

Program na početku traži od korisnika naziv tekstualnog fajla u kome treba ustanoviti broj pojavljivanja svakog od slova engleskog alfabeta, bez obzira da li su slova velika ili mala. Osnovni algoritam je:

  • Učitati ime fajla na kome je tekst, koje unosi korisni.
  • Tekst se učita u memoriju računara, a svako učitano slovo pretvara se u malo slovo pomoću string funkcije lower().
  • Kreira se lista brojača za 26 znakova engleskog alfabeta [0]..[25].
  • Za svaki znak u stringu, čiji kod predstavlja malo slovo u ASCII tabeli, odgovarajući brojač u listi poveća se za 1.
  • Na kraju se prikazuje spisak onih slova čiji je broj pojavljivanja u tekstu fajla veći od nule.

Program u jeziku Python koji realizuje ovaj algoritam može se napisati kao:

""" Program broji različita slova u tekstualnom fajlu
    i prikazuje rezultat.

    Broje se samo slova iz ASCII podskupa,
    bez obzira da li su velika ili mala.
"""
# Brojanje različitih slova u stringu (ASCII podskup)
def brojacSlova(linija, brojac):
    for ch in linija:
        if ch.isalpha():
            brojac[ord(ch) - ord('a')] = brojac[ord(ch) - ord('a')] + 1
            
filename = input("Unesite naziv fajla: ").strip()
infile = open(filename, "r") # Otvara fajla za čitanje

brojac = 26 * [0] # Inicijalizacija brojača slova
for linija in infile:
    # Poziv funkcije brojacSlova za za svaku liniju
    brojacSlova(linija.lower(), brojac)

# Prikaz rezultata
for i in range(len(brojac)):
    if brojac[i] != 0:
        print(chr(ord('a') + i) + " se pojavljuje "
            + str(brojac[i])
            + (" put" if brojac[i]==1 else " puta"))

infile.close() # Zatvaranje fajla

Kreirajte tekstualni fajl u folderu gdje sačuvate program, pod nazivom test.txt i unesi sljedeći sadržaj:

ABCDE
abcde
0123456789

Rezultat izvršavanja programa nakon čitanja fajla test.txt je:

Unesite naziv tekstualnog fajla (ASCII): test.txt
a se pojavljuje 2 puta
b se pojavljuje 2 puta
c se pojavljuje 2 puta
d se pojavljuje 2 puta
e se pojavljuje 2 puta


Program za konverziju valuta

Program za konverziju valuta računa faktor konverzije između dvije izabrane valute na osnovu njihovog aktuelnog kursa, koji se preuzima na web sajtu http://fixer.io/ u JSON formatu. Program ilustruje upotrebu modula urllib i rad s podacima u JSON formatu. Pošto je besplatna samo aktuelna lista koeficijenata za konverziju iz EUR u ostale svetske valute, u ovome primjeru je osnovna valuta EUR. Osnovni algoritam programa za konverziju valuta je:

  • Korisnik zadaje zvaničnu skraćenicu osnovne valute (EUR) i skraćenicu ciljne valute za koju se traži koeficijent konverzije.
  • Program pronalazi koeficijente konverzije za osnovnu valutu na web sajtu http://fixer.io u JSON formatu i konvertuje ih u riječnik.
  • Program po skraćenici u riječniku pronalazi koeficijent konverzije i prikazuje ga, a zatim učitava iznos za konverziju iz osnovne valute u ciljanu i prikazuje iznos u ciljnoj valuti.

Program u jeziku Python, koji realizuje ovaj algoritam je:

""" Računanje faktora konverzije iz jedne u drugu valutu

    Koeficijenti konverzije sa sajta: http://data.fixer.io
    - za korištenje podataka potrebno je obezbediti API KEY
    - besplatni su samo koeficijenti za osnovnu valutu EUR
"""
import urllib.request
import json
import sys

# Funkcija preuzima spisak valuta i vraća listu skraćenica
def listaSkracenicaValuta():
    URL = 'http://data.fixer.io/api/symbols?access_key=cb11f1ed214add8ad136c2af30b315dd'
    # Odgovor servera konvertuje se u recnik
    odgovor = urllib.request.urlopen(URL).read()
    recnik = json.loads(odgovor)
    lista = [sk for sk in recnik['symbols'] if sk!="EUR"]
    return lista
# Funkcija preuzima i koristi podatke kao string
def getInfo(izValute, uValutu):
    URL = 'http://data.fixer.io/api/latest?access_key=cb11f1ed214add8ad136c2af30b315dd'

    # Odgovor servera konvertuje se u rečnik
    odgovor = urllib.request.urlopen(URL).read()
    recnik = json.loads(odgovor)

    # Izdvajanje dela stringa koji sadrži vrednost
    recnik = recnik['rates']
    faktor = recnik[uValutu]

    return float(faktor)

def ucitajValutu(pitanje):
    while True:
        valuta = input(pitanje)
        valuta = valuta.upper() # oznaka u velika slova
        if valuta == '':
            sys.exit()
        if valuta in listaValuta:
            break
        else:
            print('Nažalost', valuta, 'nije u listi.')
    return valuta

print("Program računa koeficijent konverzije")
print("između dve od navedenih valuta:")
listaValuta = listaSkracenicaValuta() # lista skr. bez EUR
skracenice = ' '.join(listaValuta) # string skr. valuta
print(skracenice)
izValute = 'EUR'

# Izbor ciljne valute
uValutu = ucitajValutu('\nIzaberite ciljnu valutu: ')
# Faktor konverzije
faktorKonverzije = getInfo(izValute, uValutu)
print('\nKoeficijet konverzije', izValute, 'u', uValutu, 'je:', faktorKonverzije)

# Konverzija traženog iznosa
iznos = float(input('\nUnesite iznos za konverziju (EUR): '))
print("Iznos u " + uValutu + " je", iznos*faktorKonverzije)
print()

Primjer izvršavanja programa prilikom konverzije EUR u dinare (RSD) je:

Program računa faktor konverzije između EUR i jedne od navedenih valuta:

AED AFN ALL AMD ANG AOA ARS AUD AWG AZN BAM BBD BDT BGN
BHD BIF BMD BND BOB BRL BSD BTC BTN BWP BYN BYR BZD
CAD CDF CHF CLF CLP CNY COP CRC CUC CUP CVE CZK DJF DKK
DOP DZD EGP ERN ETB FJD FKP GBP GEL GGP GHS GIP GMD GNF
GTQ GYD HKD HNL HRK HTG HUF IDR ILS IMP INR IQD IRR ISK
JEP JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAK
LBP LKR LRD LSL LTL LVL LYD MAD MDL MGA MKD MMK MNT MOP
MRO MUR MVR MWK MXN MYR MZN NAD NGN NIO NOK NPR NZD OMR
PAB PEN PGK PHP PKR PLN PYG QAR RON RSD RUB RWF SAR SBD
SCR SDG SEK SGD SHP SLL SOS SRD STD SVC SYP SZL THB TJS
TMT TND TOP TRY TTD TWD TZS UAH UGX USD UYU UZS VEF VND
VUV WST XAF XAG XAU XCD XDR XOF XPF YER ZAR ZMK ZMW ZWL

Izaberite ciljnu valutu: rsd
Koeficijet konverzije EUR u RSD je: 117.558599

Unesite iznos za konverziju (EUR): 200
Iznos u RSD je 23511.7198