ascii.py
1    
2    # -----------------------------------------------------------------------------------------------
3    # 1. A konyv.txt szöveges állomány egy könyvet ábrázoló ASCII-ábrát tartalmaz. Olvassa be
4    #    ezt az állományt, és jelenítse meg a tartalmát a képernyőn!
5    # -----------------------------------------------------------------------------------------------
6    def beolvas(fajl):
7        abra = []
8        with open(fajl, 'r') as fbe:
9            for sor in fbe:                 # a fájl minden sorát szövegként (enterek nélkül) olvassuk be
10               sor = sor.strip('\n')
11               abra.append(sor)            # ezekkel a szöveggel töltjuk fel a listánkat (ábra)
12       return abra
13   # -----------------------------------------------------------------------------------------------
14   # 2. Jelenítse meg többször egymás mellett a konyv.txt állományban található ábrát! Kérje be
15   #    a felhasználótól az ábra ismétlődéseinek számát! Az ábrák után elválasztásként a „ | ”
16   #    karakterláncot jelenítse meg! Ügyeljen arra, hogy az egyes sorok különböző hosszúságúak
17   #    is lehetnek. Azt nem kell ellenőriznie, hogy az ábra az adott ismétlésszámmal valóban elfére
18   #    egymás mellett a képernyőn.
19   # -----------------------------------------------------------------------------------------------
20   def kiir(abra, ism, fajl):      # kiiras paraméterezése: lista, ismétlésszám, fájlba is kell-e írni?
21       if fajl != '':
22           fki = open(fajl, 'w')
23       if ism == 1:
24           ende = ''
25       else:
26           ende = ' | '            # ha van ismétlés, akkor ez az "elválasztó" karaktersorozat
27       # max fv. megadja azt a szöveget, ami a leghosszabb, lambda kifejezéssel szabályozzuk, hogy
28       # mit vizsgáljon maximumkereséskor - itt most a szövegek hosszát (len)
29       # len fv. a végén --> a leghosszabb szöveg karakterszáma (hossza)
30       maxhossz = len(max(abra, key = lambda x: len(x)))
31       for sor in abra:
32           for i in range(ism):
33               # ljust() fv. szóközökkel tölti fel a szöveget, úgy hogy a szöveg balra kerül, a szóközök jobbra
34               sor = sor.ljust(maxhossz)       # ez azért kell, hogy a ' | ' jó helyre kerüljön a képernyőn
35               print(sor, end = ende)
36               if  fajl != '':
37                   print(sor, end = ende, file = fki)
38           print()     # minden sor után soremelés kell
39           if  fajl != '':
40               print(file = fki)
41       if  fajl != '':
42           fki.close()
43   # -----------------------------------------------------------------------------------------------
44   # 3. Készítsen függvényt atalakit néven, amely egy tömörített ábra egy sorát tömörítetlen
45   #    formára alakítja! (Egy tömörített sor legfeljebb 200 karakterből állhat.)
46   # -----------------------------------------------------------------------------------------------
47   def atalakit(blokkok):
48       tomoritetlen = ''               # egy szöveget építünk fel
49       for i in range(len(blokkok)):
50           if i % 2 == 0:              # a blokkok szöveget indexeljük, páros indexen vannak a számok
51               x = int(blokkok[i])     # x db jelet kell majd ismételni
52           else:
53               # blokkok[i] karakter ismétlése x-szer
54               tomoritetlen += blokkok[i] * x      # így a legegyszerűbb Pythonban a megfelelő ismétlés
55       return tomoritetlen
56   # -----------------------------------------------------------------------------------------------
57   # 4. Az szg_t.txt állomány tömörített formában tartalmaz egy rajzot. Alakítsa a tömörített
58   #    ábrát tömörítetlen formába az atalakit függvény használatával, és szg.txt néven mentse el az 
59   #    eredményt, valamint jelenítse meg azt a képernyőn!
60   # -----------------------------------------------------------------------------------------------
61   def szg(fajlin, fajlout):
62       print('4. feladat')
63       forras = beolvas(fajlin)        # beolvas modul itt is felhasználható
64       abra = []                       # abra uj lista
65       for sor in forras:              
66           abra.append(atalakit(sor))  # tömörített "szövegsorok" átalakítása az atalakit modullal
67       kiir(abra, 1, fajlout)          # "általánosított" kiir modul fájlba írással
68   # -----------------------------------------------------------------------------------------------
69   # 5. Izgalmas kérdés, hogy egy-egy ábrát milyen mértékben sikerült tömöríteni a fenti
70   #    módszerrel. Kérje be a felhasználótól a tömörített, valamint tömörítetlen adatokat
71   #    tartalmazó fájl neveit majd írja ki, hogy az egyes állományok hány karaktert tartalmaznak!
72   #    A sorvégjel karaktereket (\r\n) ne vegye figyelembe! A következő sorban jelenítse meg
73   #    a tömörítési arányt két tizedesjegyre kerekítve! A tömörítési arány a tömörített ábra
74   #    karakterszáma osztva a tömörítetlen ábra karaktereinek számával.
75   # -----------------------------------------------------------------------------------------------  
76   def tomorites_vizsgalat():
77       print('5. feladat')
78       # szöveges fájlok esetén a read() művelet a teljes fájltartalmat egy szövegbe olvassa be  
79       t1 = open(input('Kérem adja meg a tömörített ábra fájlnevét: '), 'r').read()           # konyv_t.txt
80       t2 = open(input('Kérem adja meg a tömörítetlen ábra fájlnevét: '), 'r').read()         # konyv.txt
81       t1_hossz = len(t1) - t1.count('\n')         # szöveg esetén is használhatjuk a count metódust 
82       t2_hossz = len(t2) - t2.count('\n')         # az enterek megszámlálására
83       print(f'A karakterek száma a tömörített állományban: {t1_hossz}')       # enterek nélküli szöveghosszak
84       print(f'A karakterek száma a tömörítetlen állományban: {t2_hossz}')
85       print(f'A tömörítési arány: {t1_hossz/t2_hossz:.2f}')                   # valós szám, két tizedesjeggyel
86   # -----------------------------------------------------------------------------------------------
87   # 6. Készítsen statisztikát a konyv_t.txt állományban található ábráról! A képernyőn jelenjen
88   #    meg, hogy az ábra hány sorból áll, hány blokkot tartalmaz, valamint hogy mekkora az ábra
89   #    szélessége karakterekben. Utóbbi adat a leghosszabb sor karakterszámát jelenti.
90   # -----------------------------------------------------------------------------------------------
91   def statisztika(fajl):
92       print('6. feladat')
93       abra = beolvas(fajl)                # ez az előnye a modulok használatának
94       print(f'Az ábra magassága sorokban: {len(abra)}')
95       hosszak = []            # az egyes sorok milyen hosszúak lesznek, azt tároljuk...
96       blokkok = 0             # hány blokk van összesen a tömörített dormulában...
97       for sor in abra:        # abra lista szövegeinek bejárása
98           hossz = 0           # egy aktuális sor hány karakteres lesz a blokkok alapján
99           for i in range(len(sor)):
100              if i % 2 == 0:              # páros indexeken vannak a számok (lsd. 3. feladat is)
101                  hossz += int(sor[i])    # hossz "akkumulálása"
102                  blokkok += 1            # blokkok számolása
103          hosszak.append(hossz)           # hosszak lista bővítése
104      maxhossz = max(hosszak)
105      print(f'Az ábra szélessége karakterekben: {maxhossz}')      # a válasz a leghosszabb érték
106      print(f'A blokkok száma: {blokkok}')
107  # -----------------------------------------------------------------------------------------------
108  #                                           FŐMODUL
109  # -----------------------------------------------------------------------------------------------
110  if __name__ == '__main__':
111      print('1. feladat')
112      konyv = beolvas('konyv.txt')
113      kiir(konyv, 1, '')
114      print('2. feladat')
115      ism = int(input('Kérem adja meg az ismétlések számát: '))
116      kiir(konyv, ism, '')
117      szg('szg_t.txt', 'szg.txt')
118      tomorites_vizsgalat()
119      statisztika('konyv_t.txt')