2016-04-28 4 views
0

У меня есть этот текстовый файл:возвращение значения вне для цикла

[admin]# cat /etc/passwd 
root:!:0:0::/:/usr/bin/ksh 
daemon:!:1:1::/etc: 
bin:!:2:2::/bin: 
sys:!:3:3::/usr/sys: 
adm:!:4:4::/var/adm: 
uucp:!:5:5::/usr/lib/uucp: 
guest:!:100:100::/home/guest: 
nobody:!:4294967294:4294967294::/: 
lpd:!:9:4294967294::/: 
lp:*:11:11::/var/spool/lp:/bin/false 
invscout:*:200:1::/var/adm/invscout:/usr/bin/ksh 
nuucp:*:6:5:uucp login user:/var/spool/uucppublic:/usr/sbin/uucp/uucico 
paul:!:201:1::/home/paul:/usr/bin/ksh 
jdoe:*:202:1:John Doe:/home/jdoe:/usr/bin/ksh 

и коды здесь

with open(file) as f2: 
      for lines in f2: 
       if "cat /etc/passwd" in lines: 
        for i in range(3): 
         cat = f2.readline() 
         print(cat) 

, если он находит строку "cat /etc/passwd", она будет хранить следующую пару строк внутри переменная cat

выход:

root:!:0:0::/:/usr/bin/ksh 
daemon:!:1:1::/etc: 
bin:!:2:2::/bin: 

Это случай, если я вызываю cat из цикла for. Если я называю это вне цикла, я получаю только последнюю строку:

bin:!:2:2::/bin: 

Я предполагаю, что линия for i in range(3) является причиной этого. есть ли способ, которым я могу позвонить cat за пределы петель и вернуть его каждой из строк, которые я хочу напечатать?

+0

Это то, что вы хотите? http://stackoverflow.com/questions/1767513/read-first-n-lines-of-a-file-in-python – JETM

ответ

3
cat = [] 
with open(file) as f2: 
    for lines in f2: 
     if "cat /etc/passwd" in lines: 
      for i in range(3): 
       cat.append(f2.readline()) 

print cat 

Читайте о списках python.

+0

Я вижу свою проблему. Я сделал то же самое, но инициировал cat как список внутри цикла, а не за пределами цикла. Я все время забываю о мелочах. –

1

Для каждой итерации вы переписываете последнее значение cat.

Внутри цикла вы печатаете каждый раз, прежде чем перезаписывать. Вне цикла вы печатаете только свое последнее значение.

Вы можете хранить свои результаты в массиве

with open(file) as f2: 
     for lines in f2: 
      if "cat /etc/passwd" in lines: 
       cat = [] 
       for i in range(3): 
        cat.append(f2.readline()) 
        print cat[i] 

for x in cat: 
    print x 
+0

-1 Это не сработает. В этот момент 'cat' будет недоступен. Кроме того, если по какой-то причине файл имел несколько строк с '" cat/etc/passwd ", вы потеряли бы все предыдущие собранные данные –

0

вы пробовали это?

cat = '' 
with open(file) as f2: 
      for lines in f2: 
       if "cat /etc/passwd" in lines: 
        for i in range(3): 
         cat += f2.readline() 
print(cat) 
0

Смешивание iteration (for lines in f2) и read method (f2.readline) не мил. У меня есть другое решение с itertools.islice, который использует только iteration

from itertools import islice 

with open(file) as f2: 
    for line in f2: 
     if "cat /etc/passwd" in lines: 
      cat = list(islice(f2, 3)) 

print cat 

cat является list как ответ Алекс

Смежные вопросы