首页 > 解决方案 > 在 Python 中搜索和排序文件

问题描述

我正在尝试设置一个脚本来查看包含 IP 地址和日期等内容的单个文件。我想提取所有超过 365 天的数据并有一个文本文件可供查看。我不断遇到语法错误等问题。

我试过改变

day = eval(line) to day = str(line) but I get
TypeError: can't compare datetime.date to str
#!/bin/env python

from datetime import timedelta
import datetime

limit = datetime.datetime.now() +  timedelta(days=365)
with open('filename') as ifile:
    for line in ifile:
        day = eval(line)
        if day > limit:
            break
formatted_dates = [(item[0], item[1].strptime("%d/%m/%y"), item[2]) for item in sorted_dates]
for date in formatted_dates:
    print ('{}: {}'.format(date))

我想得到一个新文件,内容为:

128.xxx.xxx.xx [%d %m %y] 从最旧到最新。

我不断得到:

File "./scrpitpyth.py", line 9, in <module>
    day = eval(line)
  File "<string>", line 1
  128.xxx.xxx.xx - - [02/Feb/2016:15:00:26 -0700] 
SyntaxError: invalid syntax

我试图解析的数据如下:

128.xxx.xxx.xxx - - [20/Mar/2017:09:54:03 -0600] “POST /work/labor/HTTP/1.1”

128.xxx.xxx.xxx - - [23/Mar/2017:09:54:03 -0600] "GET /work/ HTTP/1.1" 200

128.xxx.xxx.xxx - - [24/Mar/2017:09:56:02 -0600] “获取 /work/view/laborcats

标签: pythonfiledatetimesyntax-error

解决方案


我会将此添加为评论,但我的业力太低了。

通常不建议使用 eval 函数,因为它只执行传递的任何字符串。在这种情况下,您尝试将字符串128.xxx.xxx.xx - - [02/Feb/2016:15:00:26 -0700]作为 python 命令运行。由于这不是有效的python,因此您会失败。

为了解决这个问题,我建议使用 datetime 库中的 strptime 函数将时间戳字符串转换为 datetime 对象,然后您可以使用此对象进行时间过滤。


推荐阅读