为什么grepcut()返回None?
from termcolor import colored
from subprocess import *
def grepcut(inputRaw, grep, delimit, field):
for line in inputRaw:
if grep in line:
output = line.split(delimit)[field]
return output
else:
return None
def function():
print(colored("[+] ", "green") + "Here we go!")
inputRaw = Popen(["cat outputfile"], shell=True, stdout=PIPE, universal_newlines=True).communicate()[0].rstrip()
var1 = grepcut(inputRaw, grep = 'grep this', field = 6, delimit = " ")
var2 = grepcut(inputRaw, grep = 'grep this', field = 2, delimit = " ")
print("\n")
print(var1, var2)
#if var1 or var2 is None:
# print(colored("[-] ", "red") + "Not found!!!")
#else:
# print(var1, var2)
function()
顺便说一下,这是inputRaw的内容:
A B C D E F G
H I J grep this K L M N
O P Q R S T U
此代码的输出是:
无无
答案 0 :(得分:5)
您的grepcut
仅检查第一行:如果匹配,则返回output
,否则它立即返回None
,而无需进行下一个迭代。
可能您想删除该else
分支并将return None
移动到for
之后。
def grepcut(inputRaw, grep, delimit, field):
for line in inputRaw:
if grep in line:
output = line.split(delimit)[field]
return output
return None
您甚至可以忽略return None
,因为在Python中,任何在没有显式return
的情况下终止的函数的确会返回None
,但是我会保留它,以明确表明它是而不是疏忽,但是如果函数 没有找到任何内容,则期望它返回None
。
此外,您正在通过communicate()
调用Popen
,因此您将获得 string 而不是文件对象;因此,您不能像这样直接在其行上进行迭代-在字符串上对其字符进行迭代。
如果inputRaw
确实是字符串,则必须像这样分割换行符:
def grepcut(inputRaw, grep, delimit, field):
for line in inputRaw.split('\n'):
if grep in line:
output = line.split(delimit)[field]
return output
return None