Onkohan Pythonissa olemassa vaihtelevan mittaisten tietuiden käsittelyä syötto- ja tulostustiedostoille?
Kyllä?
Voisitko kertoa hieman konkreettisemmin, mitä yrität tehdä?
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ä.
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.
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.
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.?.?
Juuri noin kuin Wiwwe ymmärsit
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: ...
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
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))
Kyllä, tuo .strip() oli siis avainjuttu!
Nyt toimii, kiitos!
Aihe on jo aika vanha, joten et voi enää vastata siihen.