Чтение и сравнение строк в файле с использованием Python - PullRequest
0 голосов
/ 04 августа 2010

У меня есть файл следующего формата.

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, и любая помощь будет очень признательна.

Ответы [ 6 ]

1 голос
/ 04 августа 2010
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> )?Должны ли вы получить «Offline»?

Еще один Edit

Я отредактировал его, чтобы сделать разумные datetime сравнения.Я думаю, что вы неправильно прочитали неравенство: мы перебираем строки в файле до первой строки после даты, которую мы хотим получить (продолжайте читать, пока statDate > lineDate).Если этот тест не пройден, line - это первая строка после желаемой даты, поэтому его значение from - это состояние на момент запроса.Вы должны вызвать функцию с datetime.datetime.

0 голосов
/ 12 августа 2010

По сути, вам нужно вытащить даты и время из вашего журнала в простой для сравнения формат. Введите 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)
0 голосов
/ 04 августа 2010

Из вопроса 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]
0 голосов
/ 04 августа 2010

Попробуйте это:

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")
0 голосов
/ 04 августа 2010

Как сказал Йони, вам, вероятно, лучше передать строковый аргумент (если он есть)Вы также можете найти типы в datetime полезными.Вы также захотите изучить функцию split .

0 голосов
/ 04 августа 2010

Я предлагаю вам прочитать в документации по Python, в частности, модуль времени и функцию strptime, которая может анализировать текстовое представление времен в программном представлении.способ, которым вы написали в вопросе, безусловно, потерпит неудачу, вы можете вызвать его со строковым представлением времени (то есть «15/07/2010 15:10:01») или передать один из типов данных, определенных во времениmodule.

EDIT: очевидно, если вы передадите строковое время, то найти его в файле будет намного проще:

if substring in line:
 # do stuff
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...