Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

Ohjelmointia teknisille viestijöille

Samankaltaiset esitykset


Esitys aiheesta: "Ohjelmointia teknisille viestijöille"— Esityksen transkriptio:

1 Ohjelmointia teknisille viestijöille
Tekninen viestintä Ohjelmointia teknisille viestijöille

2 TAPAHTUI VIIME JAKSOSSA
Tiedostonimen ja –päätteen poimiminen talteen vertailua varten: tiedostonimi = os.path.splitext(someFilename)[0] tiedostopaate = os.path.splitext(someFilename)[1] Tiedoston lukeminen listamuotoon rivi kerrallaan, jos halutaan tarkastella jotain tiettyä riviä: tiedostoRiveina = lukuTiedosto.readlines() print (tiedostoRiveina[2])

3 TAPAHTUI VIIME JAKSOSSA
Voit laatia omia funktioita Pythonissa def-avainsanan avulla: Jos funktiossa täytyy käsitellä funktion ulkopuolista tietoa, voit määrittää funktioon yhden tai useampia parametreja: def omafunktio(): print("Yay! Minifunktio") def tulostaMerkkijono(sana): sana = sana.upper() print("Tässä tulostettava merkkijono {}".format(sana)) def laskeYhteen(luku1, luku2): yht = luku1 + luku2 print("{} + {} on yhteensä {}".format(luku1, luku2, yht))

4 Funktioiden paluuarvot
Tekninen viestintä Funktioiden paluuarvot

5 PALUUARVOT Useat Pythonin sisäänrakennetut funktiot palauttavat arvoja: input() palauttaa käyttäjän syöttämän arvon int() palauttaa parametrina annetun arvon kokonaislukuna os.path.isfile() palauttaa totuusarvon joka ilmaisee oliko parametrina annettu arvo tiedosto vaiko ei

6 PALUUARVOT Omat funktiot voivat muiden funktioiden tapaan palauttaa arvon Näin funktioissa voi suorittaa esim. laskutoimituksia tai muuten käsitellä funktioon syötettyjä arvoja Paluuarvon voi tuttuun tapaan tallentaa muuttujan kun funktio on suoritettu

7 PALUUARVOT Paluuarvo määritetään return-lauseen avulla:
Paluuarvoja käyttämällä funktioiden tehtäviä saa eriytettyä tehokkaasti def kertolaskuri(luku1=1, luku2=1): tulos = luku1 * luku2 return tulos luku1 = int(input("Syötä kerrottava luku: ")) luku2 = int(input("Syötä toinen kerrottava luku: ")) tulo = kertolaskuri(luku1, luku2) print ("{} kertaa {} on on {}".format(luku1, luku2, tulo))

8 PALUUARVOT import os, os.path lopeta = False while not lopeta: hakemisto = input("Syötä hakemisto, jonka sisällön haluat nähdä tai 'L' lopettaaksesi: ").strip() if hakemisto.upper() == "L": lopeta = True else: while not os.path.isdir(hakemisto): hakemisto = input("{} ei ole hakemisto. Syötä hakemisto: ".format(hakemisto)) sisalto = os.listdir(hakemisto) print("\nHakemiston {} sisältö:".format(hakemisto)) for tiedosto in sisalto: nimiJaPolku = os.path.join(hakemisto, tiedosto) print (tiedosto)

9 PALUUARVOT import os def TarkastaLopetus(hakemisto): if hakemisto.upper() == "L": return True else: return False def KysyHakemisto(): hakemisto = input("Syötä hakemisto, jonka sisällön haluat nähdä tai 'L' lopettaaksesi: ").strip() while not os.path.isdir(hakemisto) and not hakemisto.upper() == "L": hakemisto = input("{} ei ole hakemisto. Syötä hakemisto: ".format(hakemisto)) return hakemisto def TulostaSisalto(hakemisto): sisalto = os.listdir(hakemisto) print("\nHakemiston {} sisältö:".format(hakemisto)) for tiedosto in sisalto: nimiJaPolku = os.path.join(hakemisto, tiedosto) print (tiedosto) lopeta = False while not lopeta: hakemisto = KysyHakemisto() lopeta = TarkastaLopetus(hakemisto) if not lopeta: TulostaSisalto(hakemisto)

10 PALUUARVOT Paluuarvot voivat olla joko konkreettisia arvoja – merkkijonoja, lukuja, listoja tai muita – tai sitten omaa funktiota voi käyttää arvojen tarkastamiseen Tällöin paluuarvona voi käyttää totuusarvoja, jotka kertovat toteutuiko tarkastettava asia vaiko ei

11 TOTUUSARVOT JA PALUUARVOT
Esimerkiksi os.path-moduulin isfile()-aliohjelma palauttaa totuusarvon kertoakseen oliko tarkastettava kohde tiedosto: if os.path.isfile("TECHS tehtavat-5.txt"): os.remove("TECHS tehtavat-5.txt")

12 TOTUUSARVOT JA PALUUARVOT
Käyttämällä funktioiden paluuarvoina totuusarvoja, voit käyttää omiakin funktioita ehtoina samalla tavalla: import os def isFileType(filename, ext): if os.path.splitext(filename)[1].lower() == ext: return True else: return False filelist = os.listdir(".") for file in filelist: if isFileType(file, ".py"): print("{} on {}-tiedosto".format(file, ".py"))

13 HARJOITUS: TIEDOSTOT Kirjoita ohjelma, joka:
Kysyy funktion avulla käyttäjän nimeä. Funktio ei saa hyväksyä tyhjää nimeä Tulostaa käyttäjän syöttämän nimen toisen funktion avulla

14 HARJOITUS: TIEDOSTOT Kirjoita ohjelma, joka:
Kysyy funktion avulla hakemistoa, jonka sisällön käyttäjä haluaa nähdä ja varmistaa että hakemisto on varmasti olemassa Kysyy funktion avulla minkä tyyppiset tiedostot käyttäjä haluaa hakemistosta nähdä Tulostaa toisen funktion avulla hakemiston sisällöstä oikeaa tyyppiä olevien tiedostojen nimet

15 Tekninen viestintä Tiedosto-operaatiot

16 TIEDOSTO-OPERAATIOT Pythonissa on tiedosto-operaatioita – tiedostojen kopiointia, siirtämistä ja poistamista – varten oma moduulinsa, shutil-moduuli shutil-moduulia käyttämällä voit varmistaa, että ohjelmasi tiedosto-operaatiot toimivat käyttöjärjestelmästä riippumatta oikein

17 TIEDOSTOJEN KOPIOINTI
Tiedostojen kopiointi Pythonissa onnistuu shutil-moduulista löytyvän copy()-funktion avulla copy()-funktiolle annetaan kaksi parametria, lähdetiedosto ja kohde Kohde voi olla joko tiedosto tai hakemisto Kopioitaessa lähdetiedosto jää lähdehakemistoon ja kohdehakemistoon luodaan sen kopio halutulla nimellä

18 TIEDOSTOJEN KOPIOINTI
Jos kohde on hakemisto, lähdetiedosto kopioidaan sinne samannimisenä: import shutil, os lahde = "tiedosto6.txt" kohde = os.path.join("c:", os.sep, "temp") shutil.copy(lahde, kohde)

19 TIEDOSTOJEN KOPIOINTI
Jos kohde on tiedosto (jossakin hakemistossa), lähdetiedoston nimi muuttuu kopioitaessa: import shutil, os lahde = "tiedosto6.txt" kohde = os.path.join("c:", os.sep, "temp", "tiedosto5.txt") shutil.copy(lahde, kohde)

20 TIEDOSTOJEN KOPIOINTI
Jos olet määrittänyt kohdepolun viimeiseksi elementiksi kansion, jota Python ei löydä – jos kansio on esim. poistettu: Python olettaa että polun viimeinen elementti on tiedosto Python luo edeltävään kansioon kopion lähdetiedostosta käyttäen tiedostonimenä polun viimeistä elementtiä os.path.exists()-funktiolla voit varmistua sijainnin olemassaolosta ja os.path.isdir()-funktiolla sen tyypistä: kohde = os.path.join("c:", os.sep, "temp", "uusiKansio") if os.path.exists(kohde) and os.path.isdir(kohde): shutil.copy(lahde, kohde)

21 HAKEMISTOJEN KOPIOINTI
copy()-funktiolla et voi kopioida hakemistoja, vaan tarvitset tähän shutil()-moduulin copytree()-funktiota copytree() toimii samoin kuin copy(), eli aliohjelmaan tulee syöttää parametreina lähdehakemisto ja kohdehakemisto lahde = os.path.join("c:", os.sep, "tekstit") kohde = os.path.join("d:", os.sep, "varmuuskopiot") shutil.copytree(lahde, kohde)

22 TIEDOSTOJEN SIIRTÄMINEN
Tiedostojen siirtämiseen käytetään shutil-moduulin move()-funktiota Myös move()-funktiolle annetaan parametrina tiedosto, joka halutaan siirtää, ja kohde, johon tiedosto siirretään move()-funktion avulla voi siirtää myös hakemistoja Siirrettäessä tiedostoja lähdetiedosto poistetaan lähdehakemistosta

23 TIEDOSTOJEN SIIRTÄMINEN
Jos kohde on hakemisto, lähdetiedosto siirretään kohdehakemistoon saman nimisenä: import shutil, os.path lahde = os.path.join("c:", os.sep, "tekstit", "tiedosto6.txt") kohde = os.path.join("c:", os.sep, "temp") shutil.move(lahde, kohde)

24 TIEDOSTOJEN SIIRTÄMINEN
Jos kohde on tiedosto, lähdetiedoston nimi muuttuu siirrettäessä: Myös tiedostoja siirrettäessä kannattaa hyödyntää os.path.exists()- ja os.path.isdir()-aliohjelmia import shutil, os.path lahde = os.path.join("c:", os.sep, "tekstit", "tiedosto6.txt") kohde = os.path.join("c:", os.sep, "temp", "tekstit.txt") shutil.move(lahde, kohde)

25 USEAN TIEDOSTON KOPIOIMINEN JA SIIRTÄMINEN
Yksinkertaisin tapa siirtää tai kopioida useita tiedostoja kerralla on siirtää/kopioida kansio, jossa tiedostot ovat: lahde = os.path.join("c:", os.sep, "tekstit") kohde = os.path.join("c:", os.sep, "temp", "tekstit") shutil.move(lahde, kohde) lahde = os.path.join("c:", os.sep, "tekstit") kohde = os.path.join("c:", os.sep, "temp", "tekstit") shutil.copytree(lahde, kohde)

26 USEAN TIEDOSTON KOPIOIMINEN JA SIIRTÄMINEN
Jos et halua siirtää itse kansiota, voit poimia tiedostolistan lähdekansiosta ja kopioida tiedostot listauksen perusteella: Huomaa, että os.listdir()-aliohjelma listaa vain tiedostojen nimet, joten alkuperäinen polku on liitettävä nimeen ennen kopiointia: lahde = os.path.join("c:", os.sep, "tekstit") kohde = os.path.join("c:", os.sep, "temp", "tekstit") tiedostot = os.listdir(lahde) for i in tiedostot: nimiJaPolku = os.path.join(lahde,i) shutil.copy(nimiJaPolku, kohde)

27 USEAN TIEDOSTON KOPIOIMINEN JA SIIRTÄMINEN
Jos haluat kopioida hakemistosta vain joukon tietyntyyppisiä tiedostoja, voit määrittää tiedostopäätteen if-lauseessa: Jos tarvitset kokonaista tiedostopolkua suhteellisen polun sijaan, voit luoda sen os.path.abspath()-aliohjelman avulla tiedostot = os.listdir(lahdeKansio) for i in tiedostot: if os.path.splitext(tiedosto)[1].lower() == ".txt": nimiJaPolku = os.path.join(lahdeKansio, i) shutil.copy(nimiJaPolku, kohdeKansio) nimiJaPolku = os.path.join(lahdeKansio, i) kokoPolku = os.path.abspath(nimiJaPolku)

28 HAKEMISTOJEN LUOMINEN
Hakemistoja Python-ohjelmissa voit luoda os-moduulin mkdir()-funktiolla mkdir()-funktion parametriksi annetaan hakemisto, joka ohjelmalla halutaan luoda import os uusiHakemisto = os.path.join("C:", os.sep, "tilap", "uusi-hakemisto") os.mkdir(uusiHakemisto)

29 Hakemistojen luominen
Kun yhdistät mkdir()-funktion for-silmukkaan, voit luoda kätevästi monta hakemistoa kerrallaan import os kielet = ["en-us", "fi-fi", "nb-no", "sv-se", "zh-cn"] for kieli in kielet: uusiHakemisto = os.path.join("C:", os.sep, "tilap", kieli) os.mkdir(uusiHakemisto)

30 ESIMERKKI: TIEDOSTOJEN KOPIOINTI USEASTA LÄHDEHAKEMISTOSTA
c:/kielitiedostot/en-us c:/kielitiedostot/zh-cn import shutil, os kielet = ["en-us", "fi-fi", "nb-no", "sv-se", "zh-cn"] for kieli in kielet: lahdeKansio = os.path.join ("c:\\", kielitiedostot, kieli) tiedosto-en-us.txt tiedosto-zh-cn.txt kohdeKansio = os.path.join("c:\\", "temp") tiedosto = "tiedosto-" + kieli + ".txt" lahdeTiedosto = os.path.join(lahdeKansio, tiedosto) shutil.copy(lahdeTiedosto, kohdeKansio) c:/kielitiedostot/en-us/tiedosto-en-us.txt c:/kielitiedostot/zh-cn/tiedosto-zh-cn.txt

31 Harjoitus Laadi ohjelma, joka:
luo hakemiston x:\dita-tiedostot kopioi vain DITA-tiedostot hakemistosta x:\tehtava2 hakemistoon x:\dita-tiedostot Käytä lähdetiedostoina exercise-files.zip-paketin hakemistossa tehtava2a olevia tiedostoja

32 Harjoitus Laadi ohjelma, joka:
kopioi käännösohjelman tuottamat kielitiedostot tehtava2b-hakemiston kielikohtaisista alihakemistoista hakemistoon x:\target2b-hakemistoon. Kielitiedostot noudattavat seuraavaa nimeämismallia: uiStrings-<kielikoodi>.txt, esim. uiStrings-en.txt. Ohjelman tulee kysyä käyttäjältä joka tiedoston kohdalla haluaako tämä varmasti kopioida tiedoston. Käytä lähdetiedostoina exercise-files.zip-paketin hakemistossa tehtava2b olevia tiedostoja

33 Tekninen viestintä Pakatut tiedostot

34 PAKATTUJEN TIEDOSTOJEN HALLINTA
Tiedostoja siirrellään monesti esim. ZIP-muotoisina paketteina Näin useita tiedostoja saadaan kerättyä yhteen saman tiedostonimen alle, ja alkuperäistä pienemmässä koossa Pythonissa ZIP-muotoisia paketteja voidaan hallita zipfile-moduulin avulla

35 PAKETIN AVAAMINEN Ennen kuin pakattua tiedostoa voidaan tutkia, on tiedosto avattava zipfile-moduulista löytyvän ZipFile-funktion avulla, ja tallennettava muuttujaan Kuten tavallista tiedostoa avattaessa, myös ZIP-tiedostoa avattaessä täytyy määrittää missä tilassa tiedosto avataan: import zipfile paketti = zipfile.ZipFile("C:\\tiedostopino.zip", "r") arkisto = zipfile.ZipFile("C:\\files.zip", "r") - Vain luku –tila: Paketin avaaminen ja lukeminen paketti = zipfile.ZipFile("c:\\pics.zip", "w") - Kirjoitustila: Uuden paketin luonti tai paketin tyhjennys zippi = zipfile.ZipFile("c:\\ditas.zip", "a") - Lisäystila: Tiedostojen lisääminen pakettiin

36 PAKETIN AVAAMINEN Kuten tavallista tiedostoa avattaessa, myös ZIP-tiedostoa avattaessa täytyy määrittää missä tilassa tiedosto avataan: arkisto = zipfile.ZipFile("C:\\files.zip", "r") - Vain luku –tila: voit avata paketin ja lukea sen sisällön paketti = zipfile.ZipFile("c:\\pics.zip", "w") - Kirjoitustila: Voit luoda uuden paketin tai tyhjentää vanhan paketin zippi = zipfile.ZipFile("c:\\ditas.zip", "a") - Lisäystila: Voit lisätä uusia tiedostoja pakettiin

37 PAKETIN LUKEMINEN Kun paketti on avattu, sen tietoja voi lukea zipfile-moduulin funktioiden avulla printdir()-funktio palauttaa taulukkomuotoisen listan paketin sisällöstä: import zipfile paketti = zipfile.ZipFile("C:\\tiedostokasa.zip", "r") paketti.printdir()

38 PAKETIN PURKAMINEN Paketin purkaminen käy käden käänteessä extractall()-funktion avulla: Hakemiston, johon tiedostot puretaan, voi määrittää parametrina. Jos kohdehakemistoa ei anneta, tiedostot puretaan hakemistoon, jossa python-skripti suoritetaan paketti = zipfile.ZipFile("C:\\tiedostokasa.zip", "r") paketti.extractall() paketti = zipfile.ZipFile("C:\\tiedostokasa.zip", "r") paketti.extractall("c:\\")

39 PAKETIN PURKAMINEN Jos paketista haluaa purkaa yksittäisen tiedoston, täytyy käyttää extract()-funktiota extract()-funktiolle täytyy aina antaa parametrina purettavan tiedoston nimi: paketti = zipfile.ZipFile("C:\\tiedostokasa.zip", "r") paketti.extract("yhteystiedot.dita", "c:\\") paketti.extract("kahteustiedot.dita")

40 PAKETIN PURKAMINEN Jos haluat purkaa vain tietyn nimisiä tiedostoja, sinun täytyy selvittää aluksi paketin sisältö Paketin tiedot on tallennettu ZipInfo-objekteihin, joita on yksi jokaista paketin tiedostoa kohden Jokaisella ZipInfo-objektilla on useita attribuutteja, joihin on tallennettu tietoja pakatusta tiedostosta: filename - tiedoston nimi file_size - puretun tiedoston koko compress_size - pakatun tiedoston koko Muut attribuutit:

41 PAKETIN PURKAMINEN ZipInfo-objekteihin pääsee käsiksi infolist()-funktion avulla infolist()-funktio palauttaa ZipInfo-objekteja sisältävän listan, joka voidaan lukea for-silmukassa: pakettini = zipfile.ZipFile("C:\\tiedostoja.zip", "r") tiedot = pakettini.infolist() for tieto in tiedot: print(tieto.filename) print(tieto.file_size)

42 PAKETIN PURKAMINEN Voit käsitellä infolist()-funktion palauttamien tietojen perusteella vain halutut tiedostot for-silmukassa: pakettini = zipfile.ZipFile("C:\\tiedostoja.zip", "r") kohde = os.path.join("c:\\", "kohdekansio") tiedot = paketti.infolist() for tieto in tiedot: if ".dita" in tieto.filename: pakettini.extract(tieto.filename, kohdekansio) kaannokset = zipfile.ZipFile("C:\\kaannokset.zip", "r") pakettiTiedot = kaannokset.infolist() for tieto in pakettiTiedot: if tieto.file_size > 1024: kaannokset.extract(tieto.filename)

43 TIEDOSTOJEN PAKETOINTI
Voit paketoida tiedostoja zipfile-moduulin write-funktion avulla Ennen paketointia luodaan uusi ZipFile-objekti kirjoitustilassa: Seuraavaksi määritetään pakattava tiedosto: uusiPaketti = zipfile.ZipFile("C:\\tiedostot.zip", "w") pakattavaFilu = os.path.join ("c:",os.sep, "dita-tiedostot", "keittimen-osat.dita")

44 TIEDOSTOJEN PAKETOINTI
Lopuksi tiedosto kirjoitetaan pakettiin write()-funktion avulla: Oletusarvoisesti Python ei pakkaa tiedostoja. Jos haluat pakata tiedostot, kirjoitusfunktiossa täytyy määrittää pakkausparametri: Pakkaustyyppi ZIP_DEFLATED tarkoittaa normaalia zip-pakkausta uusipaketti.write(pakattavaTiedosto) uusipaketti.write(pakattavaTiedosto, compress_type=zipfile.ZIP_DEFLATED)

45 TIEDOSTOJEN PAKETOINTI
Jos pakettiin halutaan tallentaa useita tiedostoja, lisätään ne joukon jatkoksi write()-funktiolla: tiedostot = zipfile.ZipFile("C:\\tiedostoja.zip", "w") pakattava1 = os.path.join ("c:", os.sep, "dita-tiedostot", "keittimen-osat.dita") pakattava2 = os.path.join ("c:", os.sep, "dita-tiedostot", "kahvin-keittaminen.dita") pakattava3 = os.path.join ("c:", os.sep, "dita-tiedostot", "keittimen-puhdistaminen.dita") uusiPaketti.write(pakattava1) uusiPaketti.write(pakattava2) uusiPaketti.write(pakattava3)

46 TIEDOSTOJEN PAKETOINTI
Sormien säästämiseksi kannattaa pakatessakin hyödyntää for-silmukkaa: tiedostot = zipfile.ZipFile("C:\\tiedostoJoukko.zip", "w") pakattavaHak = os.path.join ("c:", os.sep, "dita-tiedostot") pakattavaLista = os.listdir(pakattavaHak) for tiedosto in pakattavaLista: kokoNimi = os.path.join(pakattavaHak, tiedosto) tiedostot.write(kokoNimi, compress_type=zipfile.ZIP_DEFLATED)

47 Harjoitus Laadi ohjelma, joka:
purkaa tiedostot excercise-files.zip-paketista löytyvästä zip-paketista tehtava3a.zip hakemistoon x:\teht3a-puretut.

48 Harjoitus Laadi ohjelma, joka:
pakkaa hakemistosta tehtava3b löytyvät kuvatiedostot (.jpg, .png, .gif), muttei muita tiedostoja, käyttäjän parametrina määrittämään zip-pakettiin. Käytä lähdetiedostoina exercise-files.zip-paketin hakemistossa tehtava3b olevia tiedostoja

49 Harjoitus Laadi ohjelma, joka:
purkaa paketista tehtava3c.zip ainoastaan DITA-tiedostot käyttäjän määrittämään kansioon.

50 Tiedostojen tutkailu, osa 3
Tekninen viestintä Tiedostojen tutkailu, osa 3

51 XML-TIEDOSTOT XML-tiedostoja voi lukea rivi kerrallaan, mutta useimmiten se ei ole fiksuin tapa toimia Pythonin xml-moduuliin kuuluvan ElementTree-moduulin avulla XML-tiedostojen puurakenteen tarkastelu käy kätevästi

52 XML-TIEDOSTOT task title taskbody context steps step cmd uicontrol
related-links link

53 XML-TIEDOSTOT Koska moduulin varsinainen nimi on pitkä, se kannattaa tuoda ohjelmaan aliaksen avulla import xml.etree.ElementTree as ET import os file = os.path.join("ditafiles","topic.dita") tree = ET.parse(tiedosto)

54 XML-TIEDOSTOT XML-tiedosto ladataan muuttujaan käsiteltävätksi parse-funktion avulla Tämän jälkeen muuttujaan tallennetun xml-elementtipuun juurielementin voi noutaa getroot-funktiolla file = os.path.join("topic.dita") tree = ET.parse(file) print(type(tree)) root = tree.getroot()

55 XML-TIEDOSTOT Jokaiseen ElementTreen avulla käsiteltävään elementtiin liittyy joukko attribuutteja tag-attribuutti kertoo elementin tyypin attrib-attribuuttiin on tallennettu elementin attribuutit sanakirja-muodossa text-attribuutti sisältää elementin tekstisisällön file = os.path.join("topic.dita") tree = ET.parse(file) root = tree.getroot() print(root.tag) print(root.attrib) print(root.attrib["id"]) print(root.text)

56 XML-TIEDOSTOT ElementTree ei osaa käsitellä nimiavaruuksia kovin hyvin
Tämän vuoksi poikkeava nimiavaruus täytyy kirjoittaa auki attribuutteja haettaessa print(root.attrib["id"]) EI NÄIN: print(root.attrib["xml:lang"]) VAAN NÄIN: print(root.attrib["{

57 XML-TIEDOSTOT getroot-funktion avulla voit rakentaa esim. oman funktion, joka tarkastaa sille syötetyn DITA-moduulin tyypin ja tunnuksen def ditaTypeCheck(file): tree = ET.parse(file) root = tree.getroot() print("tiedosto on {}-moduuli".format(root.tag)) print("tiedoston ID on {}".format(root.attrib["id"]))

58 XML-TIEDOSTOT Tiedoston sisältöä voi tarkastella muutamalla eri tavalla Yksi tapa on etsiä elementtejä find- ja findall-funktioilla file = os.path.join("topic.dita") tree = ET.parse(file) root = tree.getroot() title = root.find("title") print(title.text)

59 XML-TIEDOSTOT Find-funktio palauttaa ensimmäisen löytämänsä hakua vastaavan elementin Jos hakua vastaavaa elementtiä ei löydy, funktio palauttaa None-objektin file = os.path.join("topic.dita") tree = ET.parse(file) root = tree.getroot() title = root.find("title") print(title)

60 XML-TIEDOSTOT Findall-funktio puolestaan palauttaa listan, jolla on kaikki hakua vastaavat elementit Jos hakua vastaavaa elementtiä ei löydy, myös tämä funktio palauttaa None-objektin file = os.path.join("topic.dita") tree = ET.parse(file) root = tree.getroot() steps = root.findall("step") >>> None

61 XML-TIEDOSTOT task Sekä find- että findall-funktiot etsivät elementtejä sen elementin alta, jossa funktio suoritetaan Esimerkin task-elementin alta löytyy suoraan vain sen lapsielementit: title, taskbody ja related-links title taskbody context steps step cmd uicontrol step cmd related-links link

62 XML-TIEDOSTOT Muihin elementteihin pääsee käsiksi xpath-kielen avulla
task Muihin elementteihin pääsee käsiksi xpath-kielen avulla Koska juurielementti näkee suoraan vain omat lapsielementtinsä, täytyy lapsielementtien alla olevia elementtejä hakea lapsielementin kautta title taskbody context steps step cmd uicontrol step cmd related-links link

63 XML-TIEDOSTOT task Jos käyttäjä haluaa tarkastella taskbody-elementin lapsielementtia context, täytyy taskbody sisällyttää hakuun: context = root.find(taskbody/context) title taskbody context steps step cmd uicontrol step cmd related-links link

64 XML-TIEDOSTOT task Step-elementit ovat puolestaan steps-elementin lapsielementtejä ja itse steps on taskbody-elementin lapsielementti Tällöin hakuun tulee sijoittaa elementin molemmat vanhemmat: stepList = root.findall(taskbody/steps/step) title taskbody context steps step cmd uicontrol step cmd related-links link

65 XML-TIEDOSTOT task Jos haku tulee kohdistaa vain johonkin tiettyyn, yksittäiseen elementtiin tai lapsielementtiin, haussa voi käyttää järjestysnumeroa Tällöin hakuun tulee sijoittaa elementin molemmat vanhemmat: secondStep = root.findall(taskbody/steps/step[2]) title taskbody context steps step cmd uicontrol step cmd related-links link

66 XML-TIEDOSTOT iter-funktio tarjoaa tavan lukea kaikki tiedoston elementit kerralla Funktio tarkastelee halutun elementin kaikki lapsielementit ja niiden lapsielementit järjestyksessä tree = ET.parse(file) for element in tree.iter(): print(element.tag) print(element.text)

67 HARJOITUS: TIEDOSTOT Kirjoita ohjelma, joka:
Käy hakemistoon tallennetut tiedostot läpi Poimii apufunktion avulla DITA-tiedostot lähempään tarkasteluun Poimii toisen apufunktion avulla concept-muotoiset DITA-tiedostot listalle Tulostaa lopuksi listan

68 HARJOITUS: TIEDOSTOT Muunna edellistä ohjelmaan niin, että:
Se käy läpi hakemistoon tallennetut tiedostot Poimii apufunktion avulla DITA-tiedostot lähempään tarkasteluun Koostaa apufunktion avulla listan, johon tallennetaan jokaisen DITA-tiedoston tiedot sanakirja-muodossa Esim: [{"filename":"example-file.dita","id":"fileID","type":"concept"}, {"filename":"task-file.dita","id":"task-fileID","type":"task"}];

69 BONUSHARJOITUS: TIEDOSTOT
Muunna edellistä ohjelmaan niin, että: Se käy läpi hakemistoon tallennetut tiedostot Poimii apufunktion avulla DITA-tiedostot lähempään tarkasteluun Koostaa apufunktion avulla listan, johon tallennetaan jokaisen DITA-tiedoston tiedot sanakirja-muodossa Kirjoittaa joka tiedoston tiedot CSV-tiedostoon niin, että yhdellä rivillä on yhden DITA-tiedoston tiedot, jossa arvot on erotettu toisistaan puolipisteillä Esim: Get.stuff.done.dita, get.stuff.done, task, en-US

70 BONUSHARJOITUS: TIEDOSTOT
Muunna edellistä ohjelmaan niin, että: Se käy läpi hakemistoon tallennetut tiedostot Poimii funktion avulla DITA-tiedostot lähempään tarkasteluun Koostaa funktion avulla listan, johon tallennetaan jokaisen DITA-tiedoston tiedot sanakirja-muodossa Tulostaa funktion avulla ensin DITA-tiedoston tiedot ruudulla ja sen jälkeen tiedoston sisällön

71 HARJOITUS: TIEDOSTOT import os import xml.etree.ElementTree as ET
def checkFiletype(file): ditaExt = ".dita" fileExt = os.path.splitext(file)[1] if fileExt == ditaExt: return True else: return False def isConcept(file): conceptTag = "concept" tree = ET.parse(file) root = tree.getroot() if root.tag.lower() == conceptTag: hakem = "tehtava1" files = os.listdir(hakem) conceptLista = [] for file in files: fullFile = os.path.join(hakem, file) if checkFiletype(fullFile): if isConcept(fullFile): conceptLista.append(file) print(conceptLista)

72 HARJOITUS: TIEDOSTOT import os, xml.etree.ElementTree as ET
def checkFiletype(file): ditaExt = ".dita" fileExt = os.path.splitext(file)[1] if fileExt == ditaExt: return True else: return False def pullFileInfo(file): tree = ET.parse(file) root = tree.getroot() fileId = root.attrib["id"] fileType = root.tag fileInfo = {"filename":file, "id":fileId, "type":fileType} return fileInfo hakem = "tehtava1" files = os.listdir(hakem) ditalista = [] for file in files: fullFile = os.path.join(hakem,file) if checkFiletype(fullFile): info = pullFileInfo(fullFile) ditalista.append(info) for item in ditalista: print("{}\n".format(item))

73 HARJOITUS: TIEDOSTOT import os, xml.etree.ElementTree as ET
def checkFiletype(file): ditaExt = ".dita" fileExt = os.path.splitext(file)[1] if fileExt == ditaExt: return True else: return False def pullFileInfo(file): tree = ET.parse(file) root = tree.getroot() lang = root.attrib["{ fileId = root.attrib["id"] fileType = root.tag fileInfo = {"filename":file, "id":fileId, "type":fileType, "language":lang} return fileInfo def writeFileInfo(info): file = open("ditatiedot.csv", "a") file.write("{}, {}, {}, {}\n".format(info["filename"],info["id"],info["type"],info["language"])) file.close() files = os.listdir(".") ditalista = [] for file in files: if checkFiletype(file): info = pullFileInfo(file) ditalista.append(info) for item in ditalista: writeFileInfo(item)

74 XML-SISÄLLÖN MUOKKAUS
ElementTreen avulla XML-tiedostojen sisältöä voi myös muokata Tekstin muokkaaminen onnistuu helposti kunkin elementin text-attribuutin kautta tree = ET.parse(file) root = tree.getroot() title = root.find("title") title.text = "Uusi otsikko"

75 XML-SISÄLLÖN MUOKKAUS
Muokkaukset voi kohdistaa yksittäisten elementtien sijaan myös useisiin elementteihin kerralla Muokkaus on tarkempi kuin haku ja korvaus, koska muutos kohdistuu vain haluttuun osaan moduulia def replace_content(elem): if type(elem.text) == str: elem.text = elem.text.replace("EX2000", "EX2000B", 10) root = tree.getroot() for elem in root.iter(): replace_content(elem) tree.write(file)

76 XML-SISÄLLÖN MUOKKAUS
Elementin attribuutit on tallennettu kirjastoon, jota voi käsitellä attrib-attribuutin kautta tree = ET.parse(file) root = tree.getroot() root.attrib["id"] = "uusi-id"

77 XML-SISÄLLÖN MUOKKAUS
Jos elementin yksittäisellä attribuutilla on useita arvoja, ne on kaikki tallennettu saman avaimen alle, välilyönnein eroteltuna tree = ET.parse(file) root = tree.getroot() para = root.find("taskbody/context/p") print(para.attrib) >>> {'product': 'EX2000 EX2000-LX EX2000-LE'}

78 XML-SISÄLLÖN MUOKKAUS
Näissä tapauksissa attribuuttien arvot saa kätevämmin käsiteltävään muotoon – listaksi – split-funktion avulla Listan voit liittää takaisin merkkijonoksi join-funktiolla para = root.find("taskbody/context/p") print(para.attrib) >>> {'product': 'EX2000 EX2000-LX EX2000-LE'} # Muunnetaan product-avaimen arvona oleva merkkijono listaksi paraProdAttr = para.attrib["product"].split() # Poistetaan listalta sen toinen kohta paraProdAttr.pop(1) # Muokataan jäljelle jäänyt lista merkkijonoksi join-funktiolla # ja tallennetaan se product-attribuutin uudeksi arvoksi para.attrib["product"] = " ".join(paraProdAttr)

79 XML-SISÄLLÖN MUOKKAUS
Uusien elementtien lisääminen sisältöön onnistuu Element- ja SubElement-funktioiden avulla Element-funktiota käytetään yleensä juurielementin luomiseen Kun juurielementti on luotu, sen voi muuntaa puurakenteeksi ElementTree-funktiolla ja kirjoittaa tiedostoon task = ET.Element('task') tree = ET.ElementTree(task) tree.write('testi.dita')

80 XML-SISÄLLÖN MUOKKAUS
SubElement-funktiolla voit lisätä lapsielementtejä juurielementin tai toisten lapsielementtien alle # Luodaan juurielementtin task = ET.Element('task') # Luodaan sen alle title-elementti title = ET.SubElement(task, 'title') title.text = "Otsikko" #Luodaan taskbody-elementti taskbody = ET.SubElement(task, 'taskbody') #Luodaan taskbody-elementin alle p-elementti p1 = ET.SubElement(taskbody, 'p') p1.text = "Esimerkkisisältö"

81 XML-SISÄLLÖN MUOKKAUS
Muutokset puurakenteen osiin (elementteihin ja attribuutteihin) tallennetaan puun write()-funktiolla tree = ET.parse(file) root = tree.getroot() root.attrib["id"] = "uusi-id” tree.write(file)

82 Tekninen viestintä Lopputyö

83 Lopputyö Vaihtoehto 1: Laadi ohjelma, joka:
Kopioi joko kaikki DITA-tiedostot tai kaikki txt–muotoiset UI-kielitiedostot kielikohtaisista alihakemistoista käyttäjän haluamaan kansioon Kysyy käyttäjältä kummat tiedostotyypit tämä haluaa kopioida Tulostaa lopuksi listan kopioiduista tiedostoista ja kertoo mihin hakemistoon ne kopioitiin Tehtävässä käytettävät tiedostot ovat paketissa lopputyo-1.zip

84 Lopputyö Vaihtoehto 2: Laadi ohjelma, joka tarkastelee DITA-tiedostoja: Ohjelman tulee kysyä käyttäjältä missä kansiossa tarkasteltavat DITA-tiedostot ovat Ohjelman tulee lukea kaikki DITA-tiedostot, joita kansiossa on, tai ilmoittaa käyttäjälle ettei kansiossa ollut DITA-tiedostoja Ohjelman tulee tuottaa CSV-muotoinen lista DITA-tiedostoista ja tiedostojen seuraavista tiedoista: tiedostonimi ja moduulin tyyppi. CSV-muotoisessa tiedostossa yhden tiedoston tiedot ovat yhdellä rivillä, pilkuilla toisistaan erotettuina. Esim.: dita-tiedosto1.dita, task dita-tiedosto2.dita, concept Ohjelman tulee kertoa mihin CSV-tieto tallennettiin Tehtävässä käytettävät tiedostot ovat paketissa lopputyo-2.zip

85 Lopputyö Vaihtoehto 3: Laadi ohjelma, joka:
Ottaa käyttäjältä syötteenä ZIP-paketin nimen ja sijainnin Ottaa käyttäjältä syötteenä paikan, johon paketti puretaan Katsoo mikä kielikoodi tiedostonimessä on Purkaa paketista vain DITA-tiedostot kohdehakemistoon kielikoodin mukaiseen alihakemistoon. Jos käyttäjä esim. syöttää kohdehakemistoksi hakemiston C:\Tilap, tiedosto jokutiedosto_en-us.dita puretaan hakemistoon C:\Tilap\en-us Tehtävässä käytettävät tiedostot ovat paketissa lopputyo-3.zip

86 Lopputyö Vaihtoehto 4: Laadi ohjelma, joka päivittää DITA-tiedostoja:
Ohjelman tulee kysyä käyttäjältä missä kansiossa tarkasteltavat DITA-tiedostot Ohjelman tulee lukea kaikki DITA-tiedostot ja päivittää viittaukset MoccaBlaster EX malliin viittaamaan MoccaBlaster EX2000-B malliin Product-attribuutin arvo EX2000 muuttuu muotoon EX2000B Tuotenimi muuttuu muotoon MoccaBlaster EX2000-B Ohjelman tulee tallentaa päivitetyt tiedostot Tehtävässä käytettävät tiedostot ovat paketissa lopputyo-4.zip

87 Lopputyö Vaihtoehto 5: Laadi kahden pelaajan pelattava ristinolla-peli, jossa pelaajat valitsevat vuorotellen ruudun, johon haluavat laittaa merkkinsä Voit laatia peliin menun, johon ohjelma päätyy aina pelin päätteeksi Halutessasi voit myös laatia pelin, jota voi pelata tietokonetta vastaan. Voit laatia tietokoneelle toimivan pelistrategian esim. wikipedia-artikkelin pohjalta:


Lataa ppt "Ohjelmointia teknisille viestijöille"

Samankaltaiset esitykset


Iklan oleh Google