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
Voit laatia omia funktioita Pythonissa def-avainsanan avulla: def omafunktio(): print("Yay! Minifunktio") Jos funktiossa täytyy käsitellä funktion ulkopuolista tietoa, voit määrittää funktioon parametreja: def tulostaMerkkijono(sana): sana = sana.upper() print("Tässä on tulostettava merkkijono {}".format(sana))

3 TAPAHTUI VIIME JAKSOSSA
Paluuarvojen avulla funktiot voivat esim. tarkastaa arvoja. Oheinen funktio tarkastaa onko parametrina annetun tiedoston tiedostopääte sama kuin parametrina annettu pääte: def tarkastaTyyppi(tiedosto, paate): if os.path.splitext(tiedosto)[1].lower() == ext: return True else: return False for file in filelist: if tarkastaTyyppi(file, ".py"): print("{} on {}-tiedosto".format(file, ".py"))

4 TAPAHTUI VIIME JAKSOSSA
Paluuarvojen avulla funktiot voivat myös palauttaa käsiteltyjä tietoja muun ohjelman käyttöön def kysyHakemisto(): dir = input("Syötä hakemisto: ").strip() while not os.path.exists(dir) or not os.path.isdir(dir): if not os.path.isdir(dir): dir = input("{} ei ole hakemisto. Syötä hakemisto:".format(dir)) else: dir = input("Hakemistoa {} ei ole. Syötä hakemisto: ".format(dir)) return dir hakemisto = kysyHakemisto() tulostaSisalto(hakemisto)

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

6 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

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

8 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)

9 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()

10 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)

11 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["{

12 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"]))

13 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)

14 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)

15 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

16 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

17 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

18 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

19 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

20 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

21 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)

22 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

23 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"}];

24 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

25 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

26 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"

27 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)

28 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"

29 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'}

30 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)

31 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')

32 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ö"

33 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)

34 Miniprojekti: Siivousautomaatti
Suvi-Uuno on kirjoitellut DITA-tiedostoja huolimattomasti ja huomaa naputelleensa context-elementtiin kuuluvat tiedot vahingossa shortdesc-elementtiin Rakennetaan skripti, joka korjaa siirtää shortdesc-elementin sisällön context-elementtiin

35 Tekninen viestintä Tiedosto-operaatiot

36 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

37 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ä

38 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)

39 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)

40 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)

41 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)

42 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

43 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)

44 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)

45 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)

46 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)

47 USEAN TIEDOSTON KOPIOIMINEN JA SIIRTÄMINEN
Jos haluat kopioida hakemistosta vain joukon tietyn tyyppisiä 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)

48 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)

49 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)

50 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

51 Harjoitus Laadi ohjelma, joka:
luo hakemiston x:\dita-tiedostot kopioi vain DITA-tiedostot hakemistosta x:\tehtava2 hakemistoon x:\dita-tiedostot Käytä lähdetiedostoina tehtava2.zip-paketin hakemistoa tehtava2a

52 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 tehtava2.zip-paketin hakemistoa tehtava2b.

53 Tekninen viestintä Pakatut tiedostot

54 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

55 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

56 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

57 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()

58 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:\\")

59 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")

60 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:

61 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)

62 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:", os.sep, "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)

63 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")

64 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)

65 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)

66 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)

67 Harjoitus Laadi ohjelma, joka:
purkaa tiedostot paketista tehtava3a.zip hakemistoon x:\teht3a-puretut.

68 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 paketin tehtava3b.zip tiedostoja

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

70 Tekninen viestintä Lopputyö

71 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

72 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, tiedoston tunnus, tiedoston kielikoodi, moduulin otsikko (title-elementti) ja moduulin tyyppi Ohjelman tulee kertoa mihin CSV-tieto tallennettiin Tehtävässä käytettävät tiedostot ovat paketissa lopputyo-2.zip

73 Lopputyö Vaihtoehto 3: 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-3.zip

74 Lopputyö Vaihtoehto 4: 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