Naloge - datoteke in oblikovanje nizov
Vreme
Napišite funkcijo preberi_vrstice(ime_datoteke), ki prebere in vrne seznam vrstic v datoteki ime_datoteke.
Primer za datoteko podatki.txt, ki se ustvari ob klicu testov za te vaje:
>>> preberi_vrstice('podatki.txt')
['Ljubljana;oblačno;12.1', 'Maribor;sončno;9', 'Koper;sončno;14.7']
Rešitev
Z zanko for def preberi_vrstice(ime_datoteke): f = open(ime_datoteke, "r", encoding="utf-8") lines = [] for line in f: lines.append(line.strip()) f.close() return lines ali z metodama read in splitlines def preberi_vrstice(ime_datoteke): return open(ime_datoteke, "r", encoding="utf-8").read().splitlines()Napiši funkcijo preberi_csv(ime_datoteke), ki odpre in prebere datoteko ime_datoteke, ki v vsaki vrstici vsebuje s podpičji ločene vremenske podatke (kraj, vreme in temperaturo), ter jih vrne kot seznam terk.
>>> podatki = preberi_csv('podatki.txt')
>>> podatki
[('Ljubljana', 'oblačno', 12.1), ('Maribor', 'sončno', 9.0), ('Koper', 'sončno', 14.7)]
Rešitev
def preberi_csv(fname): sez = [] for vrstica in preberi_vrstice(fname): kraj, vreme, temp = vrstica.split(';') sez.append((kraj, vreme, float(temp))) return sezNapiši funkcijo oblikuj(podatki), ki sprejme seznam terk podatki z vremenskimi podatki in vrne seznam nizov, ki so oblikovani, kot je prikazano spodaj:
>>> oblikuj(podatki)
['Kraj: Ljubljana, Vreme: oblačno, Temperatura: 12.1°C',
'Kraj: Maribor, Vreme: sončno, Temperatura: 9.0°C',
'Kraj: Koper, Vreme: sončno, Temperatura: 14.7°C']
Rešitev
def oblikuj(podatki): sez = [] for kraj, vreme, temp in podatki: sez.append(f'Kraj: {kraj}, Vreme: {vreme}, Temperatura: {temp}°C') return sezIzpis iz prejšnje naloge se nam ni najbolj posrečil, zato se odločimo, da bomo podatke zapisali v tabeli. V ta namen napiši funkcijo oblikuj_tabelo(podatki), ki vrne seznam nizov, ki so oblikovani na prikazan način.
>>> oblikuj_tabelo(podatki)
['Kraj Vreme Temperatura (°C)',
'------------------------------------------------',
'Ljubljana oblačno 12.1',
'Maribor sončno 9.0',
'Koper sončno 14.7']
Rešitev
def oblikuj_tabelo(podatki): sez = ['Kraj Vreme Temperatura (°C)', '------------------------------------------------'] for kraj, vreme, temp in podatki: sez.append(f'{kraj:16}{vreme:16}{temp:16}') return sezNapiši funkcijo oblikuj_tabelo_f(podatki) tako, da se bo temperatura izpisala v Fahrenheitovi lestvici. Rezultat zaokroži na eno decimalno mesto.
>>> oblikuj_tabelo_f(podatki)
['Kraj Vreme Temperatura (°F)',
'------------------------------------------------',
'Ljubljana oblačno 53.8',
'Maribor sončno 48.2',
'Koper sončno 58.5']
Rešitev
def oblikuj_tabelo_f(podatki): sez = ['Kraj Vreme Temperatura (°F)', '------------------------------------------------'] for kraj, vreme, temp in podatki: temp_f = temp * 9 / 5 + 32 sez.append(f'{kraj:16}{vreme:16}{temp_f:16.1f}') return sezIzpis bi lahko bil še preglednejši, če bi tabelo oblikovali, kot je prikazano spodaj
(dokumentacija). V ta namen napiši funkcijo oblikuj_pike(podatki).
>>> oblikuj_pike(podatki)
['Kraj Vreme Temperatura (°F)',
'------------------------------------------------',
'Ljubljana.......oblačno.....................53.8',
'Maribor.........sončno......................48.2',
'Koper...........sončno......................58.5']
Rešitev
def oblikuj_pike(podatki): sez = ['Kraj Vreme Temperatura (°F)', '------------------------------------------------'] for kraj, vreme, temp in podatki: temp_f = temp * 9 / 5 + 32 sez.append(f'{kraj:.<16}{vreme:.<16}{temp_f:.>16.1f}') return sezV zadnjem stolpcu izpiši temperaturo v Fahrenheitih in Celzijah s funkcijo oblikuj_fc(podatki)
>>> oblikuj_fc(podatki)
['Kraj Vreme Temperatura °F (°C)',
'------------------------------------------------',
'Ljubljana.......oblačno..............53.8 (12.1)',
'Maribor.........sončno................48.2 (9.0)',
'Koper...........sončno...............58.5 (14.7)']
Rešitev
def oblikuj_fc(podatki): sez = ['Kraj Vreme Temperatura °F (°C)', '------------------------------------------------'] for kraj, vreme, temp in podatki: temp_f = temp * 9 / 5 + 32 temp_fc = f'{temp_f:.1f} ({temp:.1f})' sez.append(f'{kraj:.<16}{vreme:.<16}{temp_fc:.>16}') return sezNapiši funkcijo shrani(vrstice, ime_datoteke), ki seznam nizov vrstice shrani vsakega v svojo vrstico v datoteko ime_datoteke.
>>> shrani(['prva vrstica', 'druga vrstica', 'tretja vrstica'], 'datoteka.txt')
Rešitev
def shrani(vrstice, ime_datoteke): f = open(ime_datoteke, "w") for vrstica in vrstice: f.write(vrstica + '\n') f.close()Najdaljše besede
Napiši funkcijo najdaljse_besede(s), ki v nizu s poišče vse
najdaljše besede in jih vrne, ločene z vejico.
>>> najdaljse_besede('ob znaku bo ura deset in pet minut')
'znaku, deset, minut'
Rešitev
def najdaljse_besede(s): xs = s.split() # Poišči dolžino najdaljše besede naj = 0 for word in xs: if len(word) > naj: naj = len(word) # Poišči besede dolžine `naj` ys = [] for word in xs: if len(word) == naj: ys.append(word) return ', '.join(ys)Rešitev
import os for f in os.listdir(): if os.path.splitext(f)[1] == '.py': print(f) Poglejmo si iterativno rešitev težje naloge. Iterativna rešitev nam je všeč, ker uporablja samo konstrukte, ki jih že poznamo: ds = ['.'] while ds: d = ds.pop() for f in os.listdir(d): f = os.path.join(d, f) if os.path.isdir(f): ds.append(f) elif os.path.splitext(f)[1] == '.py': print(f) Težjo nalogo lahko rešimo tudi z uporabo rekurzije. def list(path): for f in os.listdir(path): f = os.path.join(path, f) if os.path.isdir(f): list(f) elif os.path.splitext(f)[1] == '.py': print(f) list('.') Ali pa uporabimo funkcijo os.walk. for dirpath, dirnames, filenames in os.walk('.'): for filename in filenames: if os.path.splitext(filename)[1] == '.py': print(os.path.join(dirpath, filename))Plagiator
Razpakirajte direktorij z desetimi datotekami in poiščite plagiatorja! Napišite program, ki ugotovi v katerih dveh datotekah se ponovi vsaj 1000 znakov.