我有一个以下格式的文件。
15/07/2010 14:14:13 changed_status_from_Offline_to_Available
15/07/2010 15:01:09 changed_status_from_Available_to_Offline
15/07/2010 15:15:35 changed_status_from_Offline_to_Away became_idle
15/07/2010 15:16:29 changed_status_from_Away_to_Available became_unidle
15/07/2010 15:45:40 changed_status_from_Available_to_Away became_idle
15/07/2010 16:05:40 changed_status_from_Away_to_Available became_unidle
15/07/2010 16:51:39 changed_status_from_Available_to_Offline
20/07/2010 13:07:26 changed_status_from_Offline_to_Available
我需要在python中创建一个具有参数的函数:日期和时间。如果日期匹配且时间小于函数调用中的时间,它应该读取文件并返回第二个状态。那是
让我说我称之为函数returnstatus(15/07/2010,15:10:01)。 该函数应转到该文件并返回当时该用户的状态,在这种情况下为“离线”。
我是一名Python新手,任何帮助都会非常感激。
答案 0 :(得分:1)
import datetime
import time
def lines( path_to_file ):
'''Open path_to_file and read the lines one at a time, yielding tuples
( date of line, time of line, status before line )'''
with open( path_to_file ) as theFile:
for line in theFile:
line = line.rsplit( " ", 1 )
yield (
datetime.datetime.strptime( line[ 0 ], "%d/%m/%Y %H:%M:%S" ),
line[ 1 ].split( "_" )[ 3 ]
)
def return_status( statDate ):
for lineDate, lineStatus in lines( path_to_file ):
if statDate > lineDate:
continue
return lineStatus
这是否有意义,或者您希望我解释一下吗?
你的意思是你上面所说的吗?
日期匹配和时间小于函数调用中的时间
换句话说,如果你致电return_status( 16/07/2010, <some.time> )
会怎么样?你应该“离线”吗?
我已对其进行了编辑,以进行合理的datetime
比较。我认为你已经错误地阅读了不等式:我们遍历文件中的行,直到第一行 我们想要获取的日期之前(继续阅读statDate > lineDate
)。此测试失败后,line
是所需日期之后的第一行,因此其from
值是我们请求时的状态。您应该使用datetime.datetime
调用该函数。
答案 1 :(得分:0)
我建议您阅读python文档,特别是time module和函数strptime,它可以将时间的文本表示形式解析为程序化表示。
按照你在问题中写的方式调用returnstatus
肯定会失败,你可能想用时间的字符串表示(即“15/07/2010 15:10:01”)或者通过传递时间模块中定义的一种数据类型。
编辑:很明显,如果你传入一个字符串时间,那么在文件中找到它会更容易:
if substring in line:
# do stuff
答案 2 :(得分:0)
答案 3 :(得分:-1)
试试这个:
import datetime
filein = open("filein", "r")
class Status:
def __init__(self, date, time, status):
print date.split('/')
day, month, year = map(int, date.split('/'))
hour, minute, second = map(int, time.split(':'))
self.date_and_time = datetime.datetime(year=year, month=month, day=day, hour=hour, minute=minute, second=second)
self.status = status
list = []
line = filein.readline().rstrip('\n')
while line != "":
print line
date, time, status = line.split(' ')[:3]
status = status.split('_')
status.reverse()
status = status[0]
status_it = Status(date=date, time=time, status=status)
line = filein.readline().rstrip('\n')
list.append(status_it)
def query (date, time):
day, month, year = map(int, date.split('/'))
hour, minute, second = map(int, time.split(':'))
date_and_time = datetime.datetime(year=year, month=month, day=day, hour=hour, minute=minute, second=second)
for counter, it in enumerate(list):
if date_and_time >= it.date_and_time and (date_and_time < list[counter + 1].date_and_time or counter == len(list) - 1):
print it.status
return
print "I don't know the status"
query("15/07/2010", "15:10:01")
答案 4 :(得分:-1)
问题user392409最有可能希望将参数作为string
传递,并希望使用单个函数。
让我说我称之为函数returnstatus(15/07/2010,15:10:01)。该函数应转到该文件并返回当时该用户的状态,在这种情况下为“离线”。
import datetime
import time
def returnstatus(d, t):
d = datetime.datetime.strptime(d, "%d/%m/%Y")
t = time.strptime(t, "%H:%M:%S")
f = open("log.txt")
for line in f:
line = line.split(" ")
line_date = datetime.datetime.strptime(line[0], "%d/%m/%Y")
line_time = time.strptime(line[1], "%H:%M:%S")
if d != line_date and t >= line_time:
continue
# Returns the first occurrence. To get all store in a list or print.
f.close()
return line[2].split("_")[3]
答案 5 :(得分:-1)
基本上,您需要做的是将日志中的日期和时间转换为易于比较的格式。输入datetime
。
import datetime
def getStatus(log_list, dt, tm):
#filter the list
log_list = [a_log_entry for a_log_entry in log_list if a_log_entry[0] == dt and a_log_entry[1] <= tm]
#sort it
log_list.sort(cmp=lambda x,y: cmp(x[1], y[1]))
if log_list is []:
return 'No status available for this day and time.'
#pull out the status
status_to_return = log_list[-1][2].split('_')[-1].strip()
return status_to_return
if __name__ == '__main__':
in_file = open('a.log', 'rU')
a_list = []
for line in in_file:
if line.strip() is not '': #handle whitespace
a_list.append(line.split(' '))
#convert string dates and times to datetime objects
a_list = [ [datetime.datetime.strptime(el[0], '%d/%m/%Y'),
datetime.datetime.strptime(el[1], '%H:%M:%S'),
el[2]] for el in a_list]
a_date = datetime.datetime(2010, 7, 15)
a_time = datetime.datetime(1900, 1, 1, 16, 1, 0)
print getStatus(a_list, a_date, a_time)