Sziasztok!
Kérdés a következő:
Hogyan tudom elérni azt pythonban, hogy egy fájl soronkénti beolvasása után az if feltételben megadott sorok után következő 1-2 sort is kiírja? Valami hasonló kellene nekem mint bash-ben a grep -A1
Példa :
Valami.txt fájl tartalma:
AAAAA
BBBBB
CCCCC
DDDDD
Kód:
with open('valami.txt','r') as txt:
for i in txt.readlines():
if 'BBBBB' in txt:
print(i)
print("i+1") -->természetesen ilyen nincs, itt csak a következő sorra utaltam
Tehát a végeredmény ez lenne:
BBBBB
CCCCC
Bocsánat a pongyola megfogalmazásért, még eléggé kezdő vagyok pythonban.
- 3092 megtekintés
Hozzászólások
Nem sok közöm van a pythonhoz, de ilyet találtam (persze mindkettőnél vizsgálni kellene, hogy az elem létezik-e):
with open('valami.txt','r') as txt:
lines=txt.readlines();
for i,t in enumerate(lines):
if 'BBBBB' in t:
print(t)
print(lines[i+1])
vagy plan b
with open('valami.txt','r') as infile:
for line in infile:
if 'BBBBB' in line:
print(line)
print next(infile)
Nekem valamiért a második jobban tetszik. :)
- A hozzászóláshoz be kell jelentkezni
python3 esetén a print-nél figyelni, hogy függvény!
with open('valami.txt','r') as infile:
for line in infile:
if 'BBBBB' in line:
print(line)
print(next(infile))
Amúgy még egy megjegyzés: mivel az eredeti kérdésben egymás alatt vannak a stringek, unix esetén ez ügye \n, a for ciklusnál tartalmazza a line változó ezt a karaktert is így a print esetén 2x lesz soremelés.
Két megoldás van rá:
1. line = line.strip() # az if előtt törölni elölről és hátulról a whitespace karaktereket (ez persze egy identált szöveg esetén gond lenne... pl *.yaml - esetleg strip('\n') de ügye ez unix text esetén csak)
2. print(line, end='') # a printnél figyelembe venni, hogy már van soremelés a line változóban, így elhagyni azt.
mind a két esetben a next-el is foglalkozni kell ugyan így...
- A hozzászóláshoz be kell jelentkezni
Köszi, ez működik, elfelejtettem hogy python3-ban kellene a next-et próbálni, én eddig 2.7-el próbálkoztam.
--
Warning! Use ANY version of Windows at your own risk!
- A hozzászóláshoz be kell jelentkezni
bocsánat az identáláshoz a code formázás lemaradt...
with open('valami.txt','r') as infile:
for line in infile:
if 'BBBBB' in line:
print(line)
print(next(infile))
- A hozzászóláshoz be kell jelentkezni
#!/usr/bin/env python3
with open('kuka.txt', 'r') as fájl:
tartalom = fájl.readlines()
tartalom = [ sor.strip() for sor in tartalom ] #levesszük s sorvégi CR[LF]-eket
for index, sor in enumerate(tartalom): #ha nem kéne az index akkor csak for sor in tartalom
print(index, sor)
if sor == 'BBBBB':
print(tartalom[index+1])
- A hozzászóláshoz be kell jelentkezni
értem, hogy az utf-8 korában mindent lehet, de változónak ékezetes nevet adni szvsz. még most is bad practice
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
s = "BBBB" # ezt keressuk a sorok elejen
A = 5 # hany sort mutassunk egy talalat utan
a = 0
f = open('valami.txt','r')
while True:
l = f.readline()
if l == '': break
p = False
if a>0:
p = True
a -= 1
if l.startswith(s):
p = True
a = A
if p:
print l
~~~~~~~~
deb http://deb.uucp.hu/ wheezy yazzy repack
- A hozzászóláshoz be kell jelentkezni
Jó lenne már leszokni az egybetűs változónevekről így 2016 tájékán, mert olvashatatlanná teszi a kódot. Ha az ember ránéz a fenti szkriptre, le kell fejben a szkriptet, hogy megértse, mire gondolt a költő. Az 'a' és az 'A' változó nevek különösen zavaróak.
A kulcsszó: intention revealing names. Javasolt olvasmány: http://www.itiseezee.com/?p=83
Kérlek, nézd meg a fenti linket, nem fogadok el olyan kifogást, hogy 'de hát én nem is vagyok fejlesztő'. :)
- A hozzászóláshoz be kell jelentkezni
Ajaj...
mov eax, 0x05
mov ebx ,fn
xor ecx, ecx
xor edx, edx
int 0x80
test eax, eax
Mondjuk az idő mindent megszépít. :D
- A hozzászóláshoz be kell jelentkezni
dehogy is szoktam egybetűs változókat használni!
viszont most nem a kernelt kódoltam, csak egy kollegának dobtam egy példakódot, alkalmi, képlet jelleggel.
sztem elég rövid ahhoz a kód h egybetűkkel is átlátható legyen. jelen szituációban a szerkezet a lényeg.
és igen, még jó hogy le kell fejben futtatni, ez a okító kód lényege. (ne lealacsonyítónak vegyétek azt h okító, hanem úgy h a kollega kérésére való segítség)
azon is csak néztem, hogy fennebb azzal volt baj, h "ékezetes változónév" ...
könyörgöm, a hup se, mihaly8712 se python interpreter. majd ha a tényleges kódot írja, akkor "fájl" helyett "fajl" lehet, "a" helyett "how_many_lines_after", "valami.txt" helyett "eles_adatok.txt".
de mostmár úgy tűnik mintha én akadtam volna fel ilyen apróságokon.
~~~~~~~~
deb http://deb.uucp.hu/ wheezy yazzy repack
- A hozzászóláshoz be kell jelentkezni
Szerintem teljesen olvasható, bár ha találat van a találatban újrakezdi (bár igazából lehet úgy is kell neki).
Így lenne olvashatatlan ;):
s = "BBBBB"
A = 2
a = 0
f = open('valami.txt','r')
while True:
l = f.readline()
if l == '': break
if a==0 and l.startswith(s):
a = A
if a>0:
print l
a-=1
- A hozzászóláshoz be kell jelentkezni
fajl:
AAAAA
BBBBB
CCCC
DDD
EE EE
Ruby-ban az alábbi módon csinálnám. Nem lenne egyszerűbb és olvashatóbb Python-ban valami hasonló logika? Tudom hogy ott is van split meg array range.
a=2; f=File.read("fajl").split("\n"); b=f.index(f.grep(/BB/i)[0]); puts f[b..b+a]
BBBBB
CCCC
DDD
- A hozzászóláshoz be kell jelentkezni