Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python ja vaihtelevan pituiset tietueet

Sivun loppuun

nieminma [01.09.2009 15:00:15]

#

Onkohan Pythonissa olemassa vaihtelevan mittaisten tietuiden käsittelyä syötto- ja tulostustiedostoille?

os [01.09.2009 15:14:17]

#

Kyllä?

Voisitko kertoa hieman konkreettisemmin, mitä yrität tehdä?

nieminma [02.09.2009 12:01:05]

#

Siis kun luen vaihtelevanmittaista tietueita sisältävää tiedostoa.
Kenttien välillä ei ole erotinmerkkejä - haluttu tieto poimitaan yleensä vaikkapa positioista 91-95, jos tuo tieto puuttuu ja tietue onkin vain 90 merkkiä pitkä, kenttä otetaan seuraavan tietueen alusta, vaikka tarkoitus tietysti olisi, että tässä tapauksessa poimittava tieto on tyhjä.

Chiman [02.09.2009 12:12:09]

#

Yleisesti ottaen kentissä pitää olla joko kiinteä pituus tai sitten pituuden ilmoittavat erotinmerkit. Miten muuten tiedät missä mikäkin tieto on tai ei ole?

Näytätkö esimerkin, niin pystyy hahmottamaan paremmin.

Metabolix [02.09.2009 17:38:22]

#

Seuraavalla rivillä on peräkkäin kolme tekstiä. Pystytkö erottamaan, mitkä ne ovat?
abcdefg

Jos et itse pysty tähän tehtävään, miten tietokonekaan pystyisi? Siispä täytyy kertoa, miten pitkä data tiedostossa on:
2ab1c4defg

Tästä voi lukea, että ensimmäinen teksti on 2 merkkiä pitkä, ab, toinen yhden merkin, c, ja kolmas neljä merkkiä, defg. Vastaava formaatti toimii myös binaaritiedostoille.

Wiwwe [02.09.2009 22:03:55]

#

Mä ymmärsin toin niin että jos rivi on 95 merkkiä pitkä, niin ne merkit 91-95 pitäis asettaa suoraan muuttujaan. Jos rivi on vaan 90 merkkiä pitkä, pitäis muuttuja asettaa tyhjäksi...
Ymmärsinköhän yhtään oikein.?.?

nieminma [03.09.2009 08:29:12]

#

Juuri noin kuin Wiwwe ymmärsit

Chiman [03.09.2009 08:36:08]

#

Ahaa, eli tuossa erotinmerkkinä on rivinvaihto. Siinä tapauksessa:

tieto = rivi[90:95]

Jos rivi on vaikka vain 90 merkkiä pitkä, tuon muuttujan sisällöksi tulee tyhjä merkkijono.

Tuota ennen tiedoston sisältö on jaettu rivit sisältäväksi listaksi, esim.

rivit = tiedoston_sisalto.split('\n')
for rivi in rivit:
    ...

nieminma [03.09.2009 11:38:14]

#

Tilanne menee näin:
syöttötiedosto ( variable length, tietueen pituudet 28, 23,15,28)

Pekka   Pkuja 1   00500 ptp1
Jukka   Pkuja 2   00501
Matti   Mkatu 3
Seppo   Mkatu 2   00505 ptp5

Tulostiedostoon halutaan vain nimi ja postitoimipaikka.
Pekan tiedot tulevat oikein, Jukan ja Matin postitoimipaikat eivät tule tyhjänä.
Sepon tiedot ovat taas oikein.
Eli kun muuttujaan postitoimipaikka luetaan tieto positiosta 25-28, niin kahdessa keskimmäisessä tapaiksessa sen arvoksi ei tule tyhjä merkkijono
(niinkuin pitäisi)

Mod. lisäsi kooditagit

Metabolix [03.09.2009 11:41:24]

#

No miten olet nyt tehnyt?

Tämä koodi lukee antamasi tiedot oikein:

#!/usr/bin/python3
rivit = open("lista.txt", "r").readlines()
for rivi in rivit:
	nimi = rivi[0:8].strip()
	osoite = rivi[8:18].strip()
	postinumero = rivi[18:24].strip()
	paikka = rivi[24:28].strip()
	print((nimi, osoite, postinumero, paikka))

nieminma [03.09.2009 14:13:14]

#

Kyllä, tuo .strip() oli siis avainjuttu!
Nyt toimii, kiitos!


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta