Tekst fajlovi

Postoje tone interesantnih podataka koji mogu biti pronađeni u tekstualnim fajlovima na internetu. U ovom poglavlju naučićemo kako se radi sa podacima memorisanim u tekst fajlovima.

Čitanje iz fajla

Pretpostavimo da imamo fajl pod nazivoma example.txt čiji sadržaj je prikazan dole, i da želimo da taj sadržaj učitamo u Python programu. Postoji više načina kako to možemo da uradimo. Posmatraćemo dva načina.

Hello.
This is a text file.
Bye!

U prvom načinu ćemo pročitati tekst fajl korišćenjem sastavljanja (comprehension) liste, tako što ćemo čitati liniju-po-liniju teksta iz fajla:

lines = [line.strip() for line in open('example.txt')]

Lista lines će izgledati ovako:

['Hello.', 'This is a text file.', 'Bye!']

String metoda strip uklanja sve blanko znake na početku i na kraju stringa. Da je nismo iskoristili svaka linija bi sadržala znak za novu liniju. Obično to nije ono što želimo.

Napomena: strip uklanja blanko znakove i sa početka i sa kraja linije. Možemo da koristimo rstrip ako želimo da uklonimo blanko znake samo sa kraja linije.

Drugi način čitanja fajla je da učitamo čitav fajl i sadržaj pridružimo string varijabli:

s = open('example.txt').read()

String s će sad biti:

'Hello.\nThis is a text file.\nBye!'

Direktorijumi (folderi)

Recimo da vaš program otvara fajl ovako:

s = open('file.txt').read()

Za fajl se pretpostavlja da se nalazi u istom direktorijumu u kojem je i vaš program. Ako je fajl u nekom drugom direktorijumu, tada morate navesti putanju za pristup tom fajlu:

s = open('c:/desktop/file.txt').read()

Upisivanje u fajl

Postoji takođe nekoliko načina kako možete upisivati tekst u fajl. Ovde ćemo posmatrati samo jedan od načina. Upisivaćemo u fajl pod nazivom writefile.txt.

f = open('writefile.txt', 'w')
print('Ovo je linija 1.', file=f)
print('Ovo je linija 2.', file=f)
f.close()

Prvo treba da otvorimo fajl. To je ono što se radi u prvoj liniji programa, gde ‘w’ označava da želimo da upisujemo u fajl. Python kreira nešto što se zove fajl objekat koji predstavlja sam fajl, a kojem smo dali ime f. To ime ćemo koristiti kad se pozivamo na otvoreni fajl. Za upisivanje u fajl koristimo print naredbu sa opcionim argumentom file koji specificira fajl u koji ćemo upisivati tekst. Kada završimo sa upisom treba da zatvorimo fajl čime obezbeđujemo da se promene izvršene. Vodite računa o tome da ako fajl writefile.txt već postoji, novi upis će zameniti tekst koji je postojao u fajlu pre našeg upisa.

Primeri

Primer 1

Napišite program koji čita listu temperatura iz fajla pod nazivom temps.txt, konvertuje ove temperature u Farenhajte i rezultate upisuje u fajl pod nazivim ftemps.txt.

file1 = open('ftemps.txt', 'w')
temperature = [line.strip() for line in open('temps.txt')]
for t in temperature:
    print(t*9/5+32, file=file1)
file1.close()

Primer 2

U nekom od ranijih poglavlja napisali smo program za kviz. Pitanja i odgovori su bili dati u listama na početku programa. Umesto toga mi želimo da pitanja i odgovori budu u fajlu. Na taj način ako želite da menjate pitanja ili odgovore, dovoljno je da željene promene izvršite u fajlu, ne dirajući program. Čak šta više, ako želite da date program nekom drugom ko ne zna Pythonm, on može da kreira vlastiti kviz tako što će upisati u fajl svoja pitanja i odgovore. Da se sve ovo uradi, dovoljno je da u vašem kviz programu na početku dodate ove dve linije (i uklonite linije sa zadavanjem liste pitanja i odgovora):

pitanja = [line.strip() for line in open('pitanja.txt')]
odgovori = [line.strip() for line in open('odgovori.txt')]

Igra sa rečima

Ako volite reči, možete se puno zabavljati sa listama reči, koje su teks fajlovi koji u svakoj liniji imaju po jednu reč. Na internetu možete da pronađete puno takvih fajlova: Jedan od njih možete da dobijete ako kliknete ovde .

Pod pretpostavko da se lista reči nalazi u fajlu wordlist.txt, ovu listu možemo učitati na sledeći načina:

wordlist = [line.strip() for line in open('wordlist.txt')]

Primer 1

Štampanje svih troslovnih reči.

for word in wordlist:
    if len(word)==3:
        print(word)

Uočite da ovaj kao i većina narednih primera mogu biti urađeni korišćenjem naredbe za sastavljanje liste, kao na primer:

print([word for word in wordlist if len(word)==3])

Primer 2

Štampanje svih reči koje počinju sa gn ili kn.

for word in wordlist:
    if word[:2]=='gn' or word[:2]=='kn':
        print(word)

Primer 3

Odredite koliki procenat reči počinje samoglasnikom.

count = 0
for word in wordlist:
    if word[0] in 'aeiou':
        count=count+1
print(100*count/len(wordlist))

Primer 4

Štampanje svih 7-slovnih reči koje počinju sa th i završavaju sa ly. Ovakve stvari su dobre za rešavanje ukrštenica.

for word in wordlist:
    if len(word)==7 and word[:2]=='th' and word[-2:]=='ly':
        print(word)

Primer 5

Štampanje prvih deset reči koje počinju slovom q.

i=0
while wordlist[i]!='q':
    i=i+1
print(wordlist[i:i+10]

Uočite da ovo nije baš najefikasniji način, pošto moramo da prođemo kroz veliki deo liste. Binarno pretraživanje bi bilo mnogo efikasnije, ali i ovaj metod radi gotovo momentalno čak i za velike liste.

Primer 6

Nađite najveću englesku reč koja se može napraviti od slova a, b, c, d, i e.

largest = 0
for word in wordlist:
    for c in word:
        if c not in 'abcde':
            break
    else:
        if len(word)>largest:
            largest=len(word)
            largest_word=word
print(largest_word)

Način na koji ovaj program radi je da za svaku reč u listi reči , for/else petljom proveravamo da vidimo da li je svako slovo u reči jedno od slova a, b, c, d, or e. Ako neko slovo nije, prekidamo petlju i nastvljamo ispitivanje sa sledećom reči iz liste. S druge strane, ako su sva slova u redu idemo na else blok u kome ispitujemo da li je njena dužina najveća.

Vežbe

12.1 Dat vam je fajl poda nazivom rezultat_ispita.txt, gde je u svakoj liniji ime, prezime i broj poena kao u sledećem primeru:

Janko Jankovic 83
Ana Mijatovic 86

Napišite program koji skenira fajl, dodaje 5 poena svakom studentu i upisuje prezime, ime i novi broj poena u fajl rezultat_ispita2.txt.

12.2 Dat vam je fajl pod nazivom ocene.txt, u kojem svaka linija sadrži prezime,ime i tri rezlultata kolokvijuma za svakog studenta, kao na primer:

Jankovic Janko 83 77 54
Mijatovic Ana 86 69 90

Napišite program kojim se određuje koliko je studenata položilo sva tri kolokvijuma (kolokvijum je položen ako je broj poena veći ili jednak 60).

12.3 Dat vam je fajl pod nazivom logfile.txt koji lista vremena ulogovanja i izlogovanja korisnika na sistem. Tipična linija u fajlu izgleda ovako:

Van Rossum, 14:22, 14:37

Svaka linija ima tri dela razdvojena zarezom: korisnicko ime, vreme ulogovanja i vreme izlogovanja. Vremena su data u 24-tvoro časovnom formatu. Možete pretpostaviti da su sva ulogovanja i izlogovanja u istom danu.

Napišite program koji skenira fajl i štampa sve korisnike koji su bili online najmanje jedan sat.

12.4 Dat vam je fajl pod nazivom studenti.txt. Tipična linija u fajlu je ovakva:

dragan katic    katic@email.mef.edu    555-3141

Dakle, u svakoj liniji je ime i prezime, email adresa i telefonski broj, svi razdvojeni tabovima (tab je specijalan slovni znak \t). Napišite program koji čita fajl liniju-po-liniju i za svaku liniju, kapitalizuje prva slova imena i prezimena i dodaje pozivni broj 011 ispred broja telefona. Program treba da ove izmene upiše u novi fajl studenti2.txt, Evo kako treba da izgleda linija novog fajla:

Dragan Katic    katic@email.mef.edu    011-555-3141

12.5 Dat vam je fajl imena.txt tkoji sadrži gomilu imena. Imena su imena i prezimena razdvojena blanko znakom. Napišite program koji od korisnika traži da unese inicijale, na primer DK ili AM i da štampa sve osobe čija imena odgovaraju tim inicijalima.

12.6 Igra rečima – Koristite fajl wordlist.txt za ovaj problem. Pronađite sledeće:

  • Sve reči koje se završavaju na ime
  • Sve reči čije je drugo, treće i četvrto slovo ave
  • Koliko reči sadrži bar jedno od sledećih slova r, s, t, l, n, e
  • Procenat reči koje sadrže bar jedno od slova r, s, t, l, n, e
  • Sve reči koje ne sadrže samoglanike
  • Sve reči koje sadrže sve samoglasnike
  • Da li ima više desetoslovnih ili sedmoslovnih reči
  • Največu reč u listi
  • Sve palindrome
  • Sve reči koje sadrže dupla slova (jedno do drugog) kao u rečima aardvark ili book, izuzimajući reči koje se završavaju na lly
  • Sve reči koje sadrže q iza kojeg ne sledi u
  • Sve reči koje sadrže zu bilo gde u reči
  • Sve reči koje sadrže ab više puta, kao što je reč habitable
  • Sve reči četiri uzastopna samoglasnika
  • Sve reči koje sadrže i slovo z i slovo w
  • Sve reči kod kojih je prvo slovo a, treće slovo e, a peto slovo i
  • Sve reči sa dva slova
  • Sve četvoroslovne reči koje počinju i završavaju istim slovom
  • Sve reči koje sadrže najmanje devet samoglasnika.
  • Sve reči koje sadrže slova a, b, c, d, e, i f u bilo kom redosledu. Reč može da sadrži i druga slova. Dva primera su reči backfield i feedback.
  • Sve reči čija su ista četiri prava i četiri poslednja slova
  • Sve reči u obliku abcd*dcba, gde je * proizvoljno dugačak niz slova.
  • Reč koja u sebi sadrži najviše slova i.

12.7 Napišite program koji pomaže u igri reči. Korisnik unese reč a program koristi listu reči da odredi da li korisnikova reč postoji ili ne.

12.8 Pretpostavimo da napišemo sve reči iz liste reči unazad pa ih aranžiramo (sortiramo) alfabetski. Napišite program koji štampa zadnju reč iz te modifikovane liste.

12.9 Napišite jednostavan program za proveru spelovanja (spell-checking) nekog teksta. Korisnik treba da unese string a program štampa sve reći za koje misli da su pogrešno napisane. To bi trebalo da budu one reči koje nisu u listi reči.

12.10 Ukrštenice: Kada rešavate ukrštenicu često imate reč u kojoj znate nekoliko slova, ali ne sva. Možete da napišete program koji vam može pomoći u takvim situacijama. U programu korisnik treba da unese reč sa slovima koje zna i sa zvezdicama za ona slova koja ne zna. Program treba da štampa listu svih reči koje odgovaraju takvom opisu. Na primer ako korisnik unese th***ly program treba da štampa reči koje bi mogle da budu rešenje, kao što su reči thickly i thirdly.

12.11 Tražite od korisnika da unese više slova. Zatim pronađite sve reči koje se mogu napraviti od tih slova, uz dozvoljeno ponavljanje.

12.12 Korišćenjem liste reči, napravite rečnik čiji ključevi su slova od a do z a vrednosti su procenti reči u kojima se ta slova pojavljuju.

12.13 Korišćenjem liste reči, napravite rečnik čiji ključevi su slova od a do z a vrednosti su procenti pojavljivanja tog slova u odnosu na ukupan broj slova u listi (time se meri frekvencija pojavljivanja slova).

12.14 Napišite program koji traži od korisnika da unese jednu reč, pa se pronalaze sve manje reči koje mogu biti napravljene od slova unete reči. Broj pojavljivanja slova u manjoj reči ne sme premašiti broj tih slova u unetoj reči.

12.15 Napišite program koji učitava fajl koji sadrži email adrese, svaka u posebnoj liniji. Program treba da štampa string koji se sastoji od svih email adresa razdvojenih tačka-zarezom.

  • Napišite program isti kao ovaj gore, ali samo sa adresama koje se ne završavaju sa @prof.mef.edu.

12.16 Fajl temperature.txt sadrži prosečne temperature za svaki dan u godini u nekom gradu. Svaka linija u fajlu sastoji se od datuma, napisanog u formatu mesec/dan, iza koga sledi jedan blanko znak pa prosečna temperatura za taj dan. Vaš program treba da pronađe 30-to dnevni period u kojem je došlo da najvećeg porasta temperature.

12.17 U jednom od ranijih poglavlja pisali smo program za igru u kojoj se u nekoj priči izostave neke reči. Vaš program je trebalo da traži od korisnika da unese reči sa kojima će biti zamenjene izostavljene reči u priči. Zatim se tako „popravljena“ priča štampa. Prepravite taj program tako da se priča učitava iz fajla. Čitanje priče iz fajla omogućava ljudima, koji ne znaju da programiraju,da koriste svoje priče a da ne moraju da menjaju program.

12.18 Akronim je skraćenica koja koristi prvo slovo iz svake reči u rečenici. Akronime vidimo svuda. Na primer FMEF Fakultet za menadžment, ekonomiju i finansije, ili RTS je Radio Televizija Srbije. Napišite program kojim se unosi akronim a program slučajno bira reči iz liste reči koje odgovaraju tom akronimu. Dole je prikazan tipičan rezultat koji se očekuje od programa

Unesite akronim: ABC
['addressed', 'better', 'common']

Unesite akronim: BRIAN
['bank', 'regarding', 'intending', 'army', 'naive']

12.19 Ovaj problem je jedna verzija igre Jotto. Komputer slučajno bira jednu petoslovnu reč bez ponovljenih slova. Korisnik ima nekoliko pokušaja da pogodi reč. Pri svakom pokušaju korisnik dobije informaciju koliko je slova pogodio.