2016-04-28 83 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: 

如果我在for循環中調用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/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

iterationfor lines in f2)和read methodf2.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 

catlist