-3

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

それを解決する方法。ありがとう!

4

4 に答える 4

1

前の答えは正しいですが、Pythonバージョン3.x +を使用しているため、別の構文エラーがあります。このバージョンでprintは、常に関数として呼び出されます。

したがって、その余分な親を追加してから、print呼び出しを関数呼び出しにします。

print("\n".join(filter(OnlyRecent,lines)))

PSコードを読みやすくするために、多くの作業を1行に詰め込むのではなく、変数を使用することもお勧めします。

于 2012-09-10T04:11:27.063 に答える
0

この行return time.strptime(line.split("[")[0].strip(),"%a %b %d %H:%M:%S %Y" <(time.time()-(60*60*24*5))には、閉じ括弧')'が1つありません。

于 2012-09-10T04:05:14.307 に答える
0

returnステートメントの最後に、さらに厳密な並列処理が必要です。

>>> def OnlyRecent(line):
...     return time.strptime(line.split("[")[0].strip(),"%a %b %d %H:%M:%S %Y"   <(time.time()-(60*60*24*5)))

あなたはあなたのコンソール自体からこれを見つけることができたでしょう!

于 2012-09-10T04:05:15.517 に答える
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)
于 2012-09-10T04:13:56.373 に答える