[MEGOLDVA]Python következő n sor kiíratása

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.

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. :)

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...


#!/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])
        

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

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ő'. :)

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

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

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