Ison tekstitiedoston luku Pythonilla

Anonyymi

Minulla on iso tiedosto kovalevyllä. Haluaisin Pythonin avulla lukea siitä tietyn rivin osan. Miten kannattaisi tehdä funktio

def read_part(file, line, start, length):

joka lukisi tiedostosta file riviltä line kohdasta start kohtaan start length olevan merkkijonon siten, että kone ei hyydy?

26

154

    Vastaukset 26

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi

      Tarvitsetko nimenomaan python koodia tähän, koska Bash Shell jo sisältää tarvittavan komennon, tai itse asiassa useammankin, joilla tuollainen saadaan toteutettua, vaikka näin:

      awk '(NR==100000){print $1}' sanasto.txt | cut -c 3-5

      Tuo suoritus kestää reippaasti alle sekunnin, vaikka kohteena on tiedosto, jossa on pitkänmatkaa yli miljoona riviä:
      real 0m0,171s
      user 0m0,157s
      sys 0m0,015s

      • Anonyymi

        Miksi kestää lukea zilioona bittä? Siis noin nopeasti.


      • Anonyymi
        Anonyymi kirjoitti:

        Miksi kestää lukea zilioona bittä? Siis noin nopeasti.

        Olikohan se aikoinaan Turbo Pascal tai joku muu, joka selvitti noita kiintolevyltä lukemisija niin että voidaan siirtyä tiedoston luennassa tietylle riville suoraan asettamalla johonkin osoitttimeen haluttu arvo, ja tämä mahdollisti palata lukemaan siitä eteen päin johon jäätiin, joten ei tarvinnut lukea tiedostoa systemaattisesti alusta asti.


      • Anonyymi
        Anonyymi kirjoitti:

        Olikohan se aikoinaan Turbo Pascal tai joku muu, joka selvitti noita kiintolevyltä lukemisija niin että voidaan siirtyä tiedoston luennassa tietylle riville suoraan asettamalla johonkin osoitttimeen haluttu arvo, ja tämä mahdollisti palata lukemaan siitä eteen päin johon jäätiin, joten ei tarvinnut lukea tiedostoa systemaattisesti alusta asti.

        What to f.. ohitetaan kaikki opittu ja mennään suoraan asiaan.
        Tuohan on nerokasta!


      • Anonyymi
        Anonyymi kirjoitti:

        Olikohan se aikoinaan Turbo Pascal tai joku muu, joka selvitti noita kiintolevyltä lukemisija niin että voidaan siirtyä tiedoston luennassa tietylle riville suoraan asettamalla johonkin osoitttimeen haluttu arvo, ja tämä mahdollisti palata lukemaan siitä eteen päin johon jäätiin, joten ei tarvinnut lukea tiedostoa systemaattisesti alusta asti.

        Eikös tuo ole aika vaarallista, koska mennään helposti vahingossa sörkkimään aivan kiellettyjä alueita ja muita tiedostojakin vaikka itse käyttöjärjestelmää.


      • Anonyymi
        Anonyymi kirjoitti:

        What to f.. ohitetaan kaikki opittu ja mennään suoraan asiaan.
        Tuohan on nerokasta!

        Anonyymi 03.12.2021 08:13
        Anonyymi 03.12.2021 08:35

        Luultavammin sama kirjoittaja (kolli), mutta kummallekin yhdessä ja erikseen. Siitä on niin kauan kun tuota kävin lävitse ja ympäristötkin on muuttuneet, mutta tiedostojen käsittelyssä käytetyt rajapinnat noudattelee varmaan edelleen tukien vanhaa käytäntöä.

        Ohjeet on varmasti nykyäänkin löydettävissä, mutta epäasiallisen tyyliset kommentit eivät houkuttele niitä etsimään, joten koettakaa opiskella omin päin. Ehkä tieto löytyy parhaitten C, C tai Delphi ohjelmointia koskevista tiedostojen käsittelystä, ehkä tarkemmin tiedostojen avauskättelyyn liittyvistä ohjeista.


      • Anonyymi
        Anonyymi kirjoitti:

        Eikös tuo ole aika vaarallista, koska mennään helposti vahingossa sörkkimään aivan kiellettyjä alueita ja muita tiedostojakin vaikka itse käyttöjärjestelmää.

        Höh. Ei mitenkään vaarallista. Tuossahan vain luetaan.


    • Anonyymi

      cut -d\/ -f1

    • Anonyymi

      Tässä vaihtoehto, joka lukee rivi kerrallaan, kunnes ollaan halutussa rivissä. Sen jälkeen funktio palauttaa halutun kokoisen siivun rivistä. Jos rivi on lyhyempi kuin "jäljellä oleva" length, niin palauttaa loppurivin. Jos taas annettu rivinumero on suurempi kuin tiedoston rivien määrä, niin palauttaa "None".

      def read_part(file, line, start, length):
          lines = 0
          with open(file, 'r') as f:
              current_line = f.readline()
              while current_line:
                  if lines == line:
                      return current_line.rstrip()[start:][:length]
                  lines = lines 1
                  current_line = f.readline()
              return None

    • Anonyymi

      Tässä python versio tuosta jonka jaoin aiemmin:
      Anonyymi 02.12.2021 23:36 tunnuksin.

      import sys
      file = open(sys.argv[1])
      rivit = file.readlines()
      print( rivit[int(sys.argv[2])].rstrip()[int(sys.argv[3]):][:int(sys.argv[4])] )

      Huomaa siinä on vain neljä (4) riviä, tuo print() rivi on pitkä, älä jaa sitä kahtia kuten se tässä näkyy. Oletetaan että tallennat sen nimellä (rfl.py) ja annat suoritus oikeudet sille. Niin käyttö menisi näin:

      rfl.py sanasto 99999 3 5

      Ja tuohan lukee sanasto nimisen tiedostosta rivin 99999 ja tulostaa siitä kolmannesta (3) merkistä eteen päin viisi (5) merkkiä.

      Aikaa tehtävään kuluu seuraavasti:
      real 0m0,192s
      user 0m0,152s
      sys 0m0,040s

      • Anonyymi

        Hups, eipä tuo print() rivi jakautunutkaan kahdelle riville, kuten pelkäsin.


      • Anonyymi

        Vieläkin on selityksessä virhe:
        "Ja tuohan lukee sanasto nimisen tiedostosta rivin 99999"

        kuuluisi lukea:
        "Ja tuohan lukee sanasto nimisen tiedoston, ja tulostaa rivin 99999"

        Eli se kyllä lukee koko tiedoston, eikä yhtä riviä.


      • Anonyymi

        Eipä tuo selittely meinaa onnistua, teletapit vielä kerran:
        "Ja tuohan lukee sanasto nimisen tiedoston, ja tulostaa riviltä 99999"


      • Anonyymi

        Pienten tiedostojen kanssa tuo .readlines() on ihan hyvä, koska lukee koko tiedoston kerralla muistiin ja on sen vuoksi nopea. Isoille tiedostoille se ei tietenkään sovi.


      • Anonyymi
        Anonyymi kirjoitti:

        Pienten tiedostojen kanssa tuo .readlines() on ihan hyvä, koska lukee koko tiedoston kerralla muistiin ja on sen vuoksi nopea. Isoille tiedostoille se ei tietenkään sovi.

        Ei toista miljoonaa riviä ilmeisesti sitten ole iso, kun aikaa menee noin vähän.

        real 0m0,192s


      • Anonyymi
        Anonyymi kirjoitti:

        Pienten tiedostojen kanssa tuo .readlines() on ihan hyvä, koska lukee koko tiedoston kerralla muistiin ja on sen vuoksi nopea. Isoille tiedostoille se ei tietenkään sovi.

        Niin ja sitten mikäs se sopii, rivi riviltä luku vai?


      • Anonyymi
        Anonyymi kirjoitti:

        Pienten tiedostojen kanssa tuo .readlines() on ihan hyvä, koska lukee koko tiedoston kerralla muistiin ja on sen vuoksi nopea. Isoille tiedostoille se ei tietenkään sovi.

        Jos koneen rahkeet eivät riitä, täytyy menetellä samalla tavalla kuin videoitten kassa, pistetään palasiksi, muokataan palasia, ja kootaan takaisin.

        Käytännössä en ole koskaan joutunut *.txt tiedostoja koon vuoksi pilkkomaan.


      • Anonyymi
        Anonyymi kirjoitti:

        Pienten tiedostojen kanssa tuo .readlines() on ihan hyvä, koska lukee koko tiedoston kerralla muistiin ja on sen vuoksi nopea. Isoille tiedostoille se ei tietenkään sovi.

        Isoja tiedostoja muokatessa, ei kannata käyttää mitä tahansa editoria. Editori joka rinkulaa pyörittää miljoona riviä sisältävän tiedoston kanssa joutaa poistaa järjestelmästä, ei sellaisella mitään tee.


      • Anonyymi
        Anonyymi kirjoitti:

        Niin ja sitten mikäs se sopii, rivi riviltä luku vai?

        Ainahan rivit joutuu jollain tavalla lukemaan.

        Readlines kiskoo koko tiedoston muistiin, jonka jälkeen sitä voi alkaa perkaamaan. Lukee siis nekin rivit, joita ei enää tarvita, jos ollaan tavoiterivin kohdalla.

        Readline taas lukee tiedostoa rivi kerrallaan. Tiedostoa siis rämpätään enemmän lueskellessa rivi kerrallaan, mutta säästetään muistia.

        Pentti Peruskoodaajalle on yleensä aivan sama miten tekee, koska harvoin tietokoneelle tarjotaan gigaluokan tekstitiedostoja. Enemmän noita pitää pallotella siinä vaiheessa, kun tehdään mahdollisimman pienillä resursseilla toimivia mikropalveluja, joilla saadaan kuitenkin haluttu lopputulos.


      • Anonyymi
        Anonyymi kirjoitti:

        Pienten tiedostojen kanssa tuo .readlines() on ihan hyvä, koska lukee koko tiedoston kerralla muistiin ja on sen vuoksi nopea. Isoille tiedostoille se ei tietenkään sovi.

        Esimerkki sellaisesta editorista löytyy ubuttajilta oletus editorina GEdit, mutta onhan se ympäristönsä veroinen, meinaan ettei kummallakaan ole mitään virkaa. Jorpakkoon joutaa molemmat heittää.


      • Anonyymi
        Anonyymi kirjoitti:

        Ainahan rivit joutuu jollain tavalla lukemaan.

        Readlines kiskoo koko tiedoston muistiin, jonka jälkeen sitä voi alkaa perkaamaan. Lukee siis nekin rivit, joita ei enää tarvita, jos ollaan tavoiterivin kohdalla.

        Readline taas lukee tiedostoa rivi kerrallaan. Tiedostoa siis rämpätään enemmän lueskellessa rivi kerrallaan, mutta säästetään muistia.

        Pentti Peruskoodaajalle on yleensä aivan sama miten tekee, koska harvoin tietokoneelle tarjotaan gigaluokan tekstitiedostoja. Enemmän noita pitää pallotella siinä vaiheessa, kun tehdään mahdollisimman pienillä resursseilla toimivia mikropalveluja, joilla saadaan kuitenkin haluttu lopputulos.

        "Pentti Peruskoodaajalle on yleensä aivan sama miten tekee"

        Minäkin katson kuuluvani tuohon ryhmään, voin vakuuttaa ettei varmasti ole sama. Mitä nopeampi sen parempi, koitahan laajemmin kilpailuttaa kaksi ohjelmaa jolla toisella menee 45 sekuntia ja toisella 0,2 sekuntia samaan tehtävään, kumpi jää henkiin.


      • Anonyymi
        Anonyymi kirjoitti:

        "Pentti Peruskoodaajalle on yleensä aivan sama miten tekee"

        Minäkin katson kuuluvani tuohon ryhmään, voin vakuuttaa ettei varmasti ole sama. Mitä nopeampi sen parempi, koitahan laajemmin kilpailuttaa kaksi ohjelmaa jolla toisella menee 45 sekuntia ja toisella 0,2 sekuntia samaan tehtävään, kumpi jää henkiin.

        Riippuu hinnoittelumallista.


    • Anonyymi

      Olisko täällä python koodaajia, mun pitäs saada tehtyy parikoodia olisko täällä ammattilaista, voin maksaa koodeista

      • Anonyymi

        Tätä sivustoa rikastavat python taidoillaan tasan kaksi kirjoittelijaa, ja minä olen niistä toinen. Minulla ei ole mitään mielitekoja sitoutua tulosvastuullisesti mihinkään.


      • Anonyymi

        Totta kai koodaajia löytyy kun hinnasta sovitaan, mutta jos sinä oikeasti olisit sellaista etsimässä, niin et sinä täällä siitä huutelisi, vaan etsisit freelanceria esimerkiksi Fiverrista.


    • Anonyymi

      Nykyään on hyvin vähän älykkäämpien kirjoituksia näillä sivuilla. Kun tarkastelee 60 ensimmäistä ketjua, niistä 54 ketjua on roskakirjoittelua, ja näitä kirjoittelee kaverit joilla ei ole mitään annettavaa kenellekään.

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Ampuminen kylpylässä

      Onko vornasen timbe käynyt hiukan kylpemässä vai mikä tämä ampumatapaus on kylpylässä? Tuntuu aika villi meno olevan naa
      Naantali
      102
      2246
    2. Kemijärvellä vesionnettomuus

      Pitkänsillan ja taiteilijanniemen välillä nähty henkilön painuvan veden alle. Mitä on tapahtunut? Onko vesihiisi taas as
      Kemijärvi
      41
      1504
    3. Hei, voitko kuunnella

      Voisitko auttaa minua selvittämään asioita? En halua ajaa sinua hulluuteen kanssani, en sitoa sinua, en esittää vaatimu
      Ikävä
      138
      1094
    4. Joku porukka lähtenyt täältä

      Ihmeen hiljainen on palsta nyt. Yleensä tänne tulvii aloituksia yms, mutta nyt on kyllä erikoisen hiljaista.
      Ikävä
      232
      1048
    5. 100
      979
    6. Miten yrität

      Vielä saada kaivattusi?
      Ikävä
      82
      866
    7. Tuletko tänään

      Jos soitan? Niin... tuletko?🖤
      Ikävä
      80
      777
    8. Se kun olit pitkästä aikaa silmieni edessä

      Oli kyllä sykähdyttävää. Tiedätkö, mikä laittaa minut ikävöimään sinua? Kun palautan mieleeni valtavan ihanan olemuksen,
      Ikävä
      53
      767
    9. Olipa yllätys

      Kuten hyvin moni tiesi/arvasi että valetta alusta loppuun toi *olemme ystäviä* satu. Instassaan käsi kädessä kuva kertoo
      Kotimaiset julkkisjuorut
      215
      754
    10. Muutto auto hakee sut tänään!

      Tein sulle oman huoneen! mieheltä naiselle
      Ikävä
      93
      739
    11. Costa Rica on tympeän makuinen kahvi

      Ostin kahvin hinnan romahduksen kunniaksi Costa Rican "Premium Blendiä". Piti olla sataprosenttista arabialaista. No ain
      Maailman menoa
      44
      730
    12. 52
      714
    13. Kiinni jäit

      Ei olisi uskonut sinusta
      Ikävä
      40
      676
    14. On todella ikävää

      Todella ikävää, että asiat ovat menneet tällaisiksi. Tämä ei ollut missään vaiheessa tarkoitukseni. Olen tehnyt virheit
      Ikävä
      79
      648
    15. Oletteko koskaan torjuneet kaivattuanne?

      Minä olen, kun en silloin tajunnut vielä ihastuneeni. Yritin paikata tapahtunutta, mutta ei onnistunut enää.
      Ikävä
      28
      546
    16. Ottanet yhteyttä

      Facebookissa,jos on jotain asiaa.Miehelle! T.M-nainen.
      Ikävä
      55
      527
    17. Hämmentävä hetki: TTK:sta pudonnut Johanna Puhakka lataa pettyneenä: "Sitä ei voi kieltää"

      Johanna Puhakka ja Jurijs Jurza Trosenko tippuivat Tanssii Tähtien Kanssa -kisasta. Suositussa viihdeohjelmassa nähtiin
      Tanssii tähtien kanssa
      14
      490
    18. Nyt ei enää ole

      Mitään mikä pitäisi mut hiljaa, kaikesta. Tämä on muutamalle henkilölle täällä.
      Ikävä
      35
      474
    19. Kai sä mies ymmärrät..

      ..ettet jättänyt vaihtoahtoa. Tottakai toivon vielä, että pystyisit toimimaan niin että asiat korjaantuisivat. Vahvast
      Ikävä
      28
      472
    20. En tiedä mitä sanoa

      Siksi en vastannut😔
      Ikävä
      33
      443
    Aihe