【问题标题】:returning value outside a for loop在 for 循环外返回值
【发布时间】:2016-08-23 07:32:13
【问题描述】:

我有这个文本文件:

[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 并让它返回我想要打印的每一行?

【问题讨论】:

标签: python loops


【解决方案1】:

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

catlist,就像 Alex 的回答一样

【讨论】:

    【解决方案2】:

    你试过了吗?

    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)
    

    【讨论】:

      【解决方案3】:

      对于每次迭代,您都会覆盖 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
      

      【讨论】:

      • -1 这不起作用。 cat 届时将超出范围。此外,如果由于某种原因该文件有多行 "cat /etc/passwd" 您将丢失所有以前收集的数据
      【解决方案4】:
      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 列表的信息。

      【讨论】:

      • 我看到了我的问题。我做了同样的事情,但在循环内启动了 cat 作为列表,而不是在循环外这样做。我总是像往常一样忘记小事。
      猜你喜欢
      • 1970-01-01
      • 2011-11-25
      • 2016-09-03
      • 1970-01-01
      • 2021-08-14
      • 2019-04-24
      • 2023-02-14
      • 2020-12-24
      • 1970-01-01
      相关资源
      最近更新 更多