Pythonban ha beolvasok fájlból adatot. Az alábbi példát?
A fájlban egymás alatt sortöréssel elválasztva az alábbiak vannak:
T
X
T
C
S
V
Hogyan tudom úgy beolvasni, hogy az elemek
így legyenek: TXT, CSV.
Tehát hármasával szeretnéd beolvasni őket.
A legegyszerűbb megoldás hogy beolvasol 3 sort, összefűzöd őket és eltárolod, és ezt addig csinálod amíg vannak még sorok:
* * * * * *
exts = []
while True:
. a = file.readline()
. b = file.readline()
. c = file.readline()
. if a and b and c:
. . exts.append(a.strip() + b.strip() + c.strip())
. else:
. . break
* * * * * *
Aztán ezt rövidítheted is listanézettel, ennek előnye hogy rövid és kompakt lesz a kód, hátránya hogy előre be kell olvasni az össze sort a memóriába, illetve ha nem vagy jártas a Pythonban nehezebb átlátni:
* * * * * *
all = [line.strip() for line in file]
exts = [a+b+c for a,b,c in zip(all[0::3], all[1::3], all[2::3])]
* * * * * *
Ha viszont nem biztos hármasával szeretnéd beolvasni, lehet hogy később úgy döntesz hogy neked a sorokat 18-asával kell beolvasni akkor nem biztos hogy jó ötlet kézzel összecsatolni a változókat hanem egy ciklusra kell rábízni a dolgot, ez nagyban bonyolítja a kódot és ajánlom hogy ezt gyakorlásképen próbáld megcsinálni önállóan, mert segít az algoritmikus gondolkodási mód kialakításában:
* * * * * *
exts = []
eof = False
while not eof:
. ext = ''
. for i in range(3):
. . letter = file.readline()
. . if letter:
. . . ext += letter.strip()
. . else:
. . . eof = True
. . . break
. else:
. . exts.append(ext)
* * * * * *
A fájlok megnyitásához ajánlom a with kulcsszót open-close helyett ami automatikusan be is zárja a fájlokat a szkóp végén:
* * * * * *
with open('filename.txt', 'rt') as file:
. . # ide írod a kódot
. . # ...
# nem kell lezárni itt már le van zárva
* * * * * *
"Igazából az állomány amiből be kéne olvasnom az adatokat marha hosszú így nem tudok végiglépegetni rajta."
Ennek nincs sok értelme tekintve hogy 1 mondattal később ciklussal akarsz végiglépkedni rajta és tárolni akarod az összes benne található információt egy listában.
Az már csak hab a tortán hogy pont azt írtad le amit korábban már megcsináltam. Miért nem ülsz neki és próbálod meg értelmezni?
* * * * * *
exts = []
while True:
. a = file.readline()
. b = file.readline()
. c = file.readline()
. if a and b and c:
. . exts.append(a.strip() + b.strip() + c.strip())
. else:
. . break
* * * * * *
Ez beolvas 3 sort, összefűzi őket és hozzáadja a elemet az exts listához egy ciklusban. Ha a fájl végére értünk kilép a ciklusból.
readline() beolvas egy sort
strip() levágja a whitespaceket, pl a sor végi '\n' karaktert azaz a soremelést
append() hozzátesz egy elemet egy listához
break kilép a ciklusból
Amit ismerned kell a megvalósításhoz:
- ciklus (while, break)
- feltételes elágazás (if, else)
- fájlból olvasás (open, readline)
- szövegkezelés (+, strip)
- listák ([], append)
Ennél egyszerűbb megoldás nagyon nincsen és ezek mind-mind nagyon alap dolgok. Nem tudom pontosan mi nem érthető de akkor ismételd át a fentebb leírt dolgokat vagy gyakorolj először könnyebb feladatokkal.
Csak, hogy jó értem amit írtál :
Addig amíg igaz:
a=egy sor beolvasása
b=egy következő sor beolvasása
if a and b c: (ez annyit tesz, ha már a ,b ,c megvan?)
ext.append(a+b+c(levágva az '\n'-ek).
Az else kitétel miért kell a végére?
Kösz a türrelmet.
A readline() ha a fájl végére ért akkor üres stringet ad vissza. Ellenőrizni kell hogy nem ért e a fájl végére, azaz az a, b és c változók nem üresek, tartalmaznak valamit.
Az "if a and b and c" azt jelenti hogy ha az a, b és c változókban van valami azaz nem üresek akkor történjen valami. Ha ezek közül bármelyik is üres akkor nem teljesül a feltétel (azaz elértük a fájl végét) és az else ágba lép be. Az else ágban a break parancs kilépteti a programot a ciklusból.
Az "if a and b and c" ugyan azt jelenti ez esetben mint az "if a != '' and b != '' and c != ''" azaz kiolvasva "ha a és b és c nem üres stringek, akkor" vágjuk le róluk a soremelést, füzük őket össze és rakjuk be a listába, egyébként (else) ha bármelyik is üres, azaz elértük a fájl végét, lépjünk ki a ciklusból.
Erre teljesen felesleges ciklusokat irogatni. Az egesz cucc 4(!!!) sor (es akkor mar a szavak hossza is parameterezve van):
# Szo hossza:
stepSize = 3
# Beolvassuk a file-t:
with open('input.txt', 'r') as f:
....string=f.read().replace('\n', '')
# Felosztjuk a beolvasott string-et egy listaba:
array = [string[i:i+stepSize] for i in range(0,len(string), stepSize)]
Ki kell hasznalni, hogy a python mennyire magas szintu programozasi nyelv, mennyire hatekonyan lehet valtozokat letrehozni es manipulalni. A python nagyon nagyon jo nyelv, de elveszik a lenyeg, ha 20 sorban csinal meg valamit az ember, ha kozben 3 ban is meg lehet.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!