我开始学习python,但我遇到了一个SyntaxError。当我构建过滤器以获取日志文件中的最新记录。 像这样的日志文件
Sat Jun 2 03:32:13 2012 [pid 12461] CONNECT: Client "66.249.68.236"
Sat Jun 2 03:32:13 2012 [pid 12460] [ftp] OK LOGIN: Client "66.249.68.236", anon password "gxxglxxxxt@google.com"
Sat Jun 2 03:32:14 2012 [pid 12462] [ftp] OK DOWNLOAD: Client "66.249.68.236", "/pub/10.5524/100001_101000/100022/readme.txt", 451 bytes, 1.39Kbyte/sec
import time
lines=[]
f= open("/opt/CLiMB/Storage1/log/vsftp.log")
line = f.readline()
lines=[line for line in f]
def OnlyRecent(line):
return time.strptime(line.split("[")[0].strip(),"%a %b %d %H:%M:%S %Y" <(time.time()-(60*60*24*5)))
print ("\n".join(filter(OnlyRecent,lines)))
f.close()
运行时出现错误
Traceback (most recent call last):
File "ex2.py", line 8, in ?
print("\n".join(filter(OnlyRecent,lines)))
File "ex2.py", line 7, in OnlyRecent
return time.strptime(line.split("[")[0].strip(),"%a %b %d %H:%M:%S %Y" <(time.time()-(60*60*24*5)))
File "/usr/lib64/python2.4/_strptime.py", line 287, in strptime
format_regex = time_re.compile(format)
File "/usr/lib64/python2.4/_strptime.py", line 264, in compile
return re_compile(self.pattern(format), IGNORECASE)
File "/usr/lib64/python2.4/_strptime.py", line 251, in pattern
format = regex_chars.sub(r"\\\1", format)
TypeError: expected string or buffer
如何解决它。谢谢!
答案 0 :(得分:1)
之前的答案是正确的,但是由于你使用的是python版本3.x +,所以还有另一种语法错误,其中print
总是被称为函数。
然后添加额外的paren,然后让你的print
调用函数调用。
print("\n".join(filter(OnlyRecent,lines)))
P.S。使用变量而不是将大量工作塞进一行也是一个好主意 使您的代码更具可读性。
答案 1 :(得分:0)
在这一行return time.strptime(line.split("[")[0].strip(),"%a %b %d %H:%M:%S %Y" <(time.time()-(60*60*24*5))
上你有一个缺少右括号')'。
答案 2 :(得分:0)
你需要在return语句的末尾加上一个额外的paranthesis。
>>> def OnlyRecent(line):
... return time.strptime(line.split("[")[0].strip(),"%a %b %d %H:%M:%S %Y" <(time.time()-(60*60*24*5)))
您可以从控制台本身找到这个!
答案 3 :(得分:0)
通过简短的线条简化您的代码阅读:
import time
def is_recent(line):
time_string = line.split("[")[0].strip()
line_time = time.strptime(time_string, '%a %b %d %H:%M:%S %Y')
return line_time < (time.time() - (60 * 60 * 24 * 5))
with open('/opt/CLiMB/Storage1/log/vsftp.log', 'r') as handle:
lines = filter(is_recent, handle)
print '\n'.join(lines)