2016-04-14 5 views
1

Я пытаюсь разбить содержимое из файла, этот файл имеет много строк, и мы не знаем, сколько строк в качестве примера я эти данные в файле:Как разделить каждую строку из файла с помощью python?

7:1_8:35_2016-04-14 
8:1_9:35_2016-04-15 
9:1_10:35_2016-04-16 

с помощью paython я хочу петлю на каждом линии и разделить каждую строку так:

for line in iter(file): 
    task =line.split("_") 
    first_time=task[0] #8:1 
    second_time=task[1] #9:35 
    date=task[2] #2016-04-15 

Но это даст мне: задачу [0] является первой береговой линии задача [1] является второй линии и так далее .... как я могу читать только один лайн и разделить его содержимое, чтобы сделать что-то и то же самое с другими линиями.

Update мой вопрос: полный код:

with open('onlyOnce.txt', 'r') as fp: 
    for f_time, sec_time, dte in filter(None, reader(fp, delimiter="_")): 

     check_stime=f_time.split(":") 
     Stask_hour=check_stime[0] 
     Stask_minutes=check_stime[1] 

     check_etime=sec_time.split(":") 
     Etask_hour=check_etime[0] 
     Etask_minutes=check_etime[1] 

     #check every minute if current information = desired information 
     now = datetime.now() 
     now_time = now.time() 
     date_now = now.date() 

     if (time(Stask_hour,Stask_minutes) <= now_time <= time(Etask_hour,Etask_minutes) and date_now == dte): 
      print("this line in range time: "+ f_time) 
     else: 
      print("") 
fp.close() 

Моя цель из этого кода: проверить текущее время каждой линии, и когда линия тока в диапазоне от «первой линии» // делаем somthing, это как сделать расписание или будильник.

Ошибка:

Traceback (most recent call last): 
    File "<encoding error>", line 148, in <module> 
TypeError: 'module' object is not callable 

Окей, окончательный Обновление:

from datetime import datetime,time 
from csv import reader 

with open('onlyOnce.txt', 'r') as fp: 
    for f_time, sec_time, dte in filter(None, reader(fp, delimiter="_")): 

     check_stime=f_time.split(":") 
     Stask_hour=check_stime[0] 
     Stask_minutes=check_stime[1] 

     check_etime=sec_time.split(":") 
     Etask_hour=check_etime[0] 
     Etask_minutes=check_etime[1] 

     #check every minute if current information = desired information 
     now = datetime.now() 
     now_time = now.time() 
     date_now = now.date() 

     if time(int(Stask_hour),int(Stask_minutes)) <= now_time <= time(int(Etask_hour),int(Etask_minutes) and dte == date_now): 
      print("this line in range time: "+ f_time) 
     else: 
      print("") 
fp.close() 

Но я хочу задать глупый вопрос:/ Когда я проверить эту логику, не будет печатать "да" !! но дата равна 2016-04-14, так почему бы не правильно? Оо я запутался

if('2016-04-14' == datetime.now().date()): 
    print("yes") 

Спасибо за каждый мне помогли: Padraic Cunningham и других

ответ

1

Используй csv reader пропускание file object и использовать _ в качестве разделителя:

from csv import reader 

with open("infile') as f: 
    # loop over reader getting a row at a time 
    for f_time, sec_time, dte in reader(f, delimiter="_"): 
     print(f_time, sec_time, dte) 

который даст вы, например,:

In [2]: from csv import reader 
In [3]: from StringIO import StringIO 

In [4]: for f,s,d in reader(StringIO(s), delimiter="_"): 
    ...:   print(f,s,d)  
    ...:  
('7:1', '8:35', '2016-04-14') 
('8:1', '9:35', '2016-04-15') 
('9:1', '10:35', '2016-04-16') 

Поскольку у вас есть пустые строки нам нужно отфильтровать те из:

with open("infile') as f: 
    for f_time, sec_time, dte in filter(None, reader(f, delimiter="_")): 
     print(f_time, sec_time, dte) 

Так что теперь пустые строки будут удалены:

In [5]: s = """7:1_8:35_2016-04-14 
    ...: 8:1_9:35_2016-04-15 
    ...: 
    ...: 9:1_10:35_2016-04-16""" 
In [6]: from csv import reader  
In [7]: from StringIO import StringIO  
In [8]: for f,s,d in filter(None, reader(StringIO(s), delimiter="_")): 
    ...:   print(f,s,d) 
    ...:  
('7:1', '8:35', '2016-04-14') 
('8:1', '9:35', '2016-04-15') 
('9:1', '10:35', '2016-04-16') 

Если вы хотите сравнить текущую дату и час и минуту по отношению к текущее время:

from datetime import datetime 
from csv import reader 

with open('onlyOnce.txt', 'r') as fp: 
    for f_time, sec_time, dte in filter(None, reader(fp, delimiter="_")): 
     check_stime = f_time.split(":") 
     stask_hour= int(check_stime[0]) 
     stask_minutes = int(check_stime[1]) 
     check_etime = sec_time.split(":") 
     etask_hour = int(check_etime[0]) 
     etask_minutes = int(check_etime[1]) 

     # check every minute if current information = desired information 
     now = datetime.now() 
     hour_min_sec = now.hour, now.minute, now.second 

     if now.strftime("%Y-%d-%m") == dte and (stask_hour, stask_minutes, 0) <= hour_min_sec <= (etask_hour, etask_minutes, 0): 
      print("this line in range time: " + f_time) 
     else: 
      print("") 

Или более простой способ может быть просто разобрать раз:

from datetime import datetime 
from csv import reader 

with open('onlyOnce.txt', 'r') as fp: 
    for f_time, sec_time, dte in filter(None, reader(fp, delimiter="_")): 
     check_stime = datetime.strptime(f_time,"%H:%m").time() 
     check_etime = datetime.strptime(f_time,"%H:%m").time() 
     # check every minute if current information = desired information 
     now = datetime.now() 

     if now.strftime("%Y-%d-%m") == dte and check_etime <= now.time() <= check_etime: 
      print("this line in range time: " + f_time) 
     else: 
      print("") 
+0

я попробовал ваш код, но у меня есть эта ошибка «Traceback (самый последний вызов последнего): Файл„<ошибка кодирования>“, строка 95, в ValueError: не хватает значений для распаковки (ожидается 3, получил 0) «моя строка95 есть» для f_time, sec_time, dte в reader (f, delimiter = «_»): « – Samah

+0

@Samah, тогда у вас будут пустые строки, я отредактирую –

+0

, я отредактирую свой вопрос выше, пожалуйста, посмотрите it :) – Samah

1

Это наиболее эффективный способ чтения файла, загружая одну строку за строкой в ​​память.

def parse_line(line): 
    splitted = line.split('_') 
    first = splitted[0] 
    second = splitted[1] 
    date = splitted[2] 


with open('test.txt', 'r') as fp: 
    for line in fp: 
     parse_line(line) 
+0

я пытается ваш код, но у меня есть ошибки «Traceback (самый последний вызов последнего): File„<ошибка кодирования>“, строка 136, в IndexError: индекс списка из диапазона "---> моя строка вторая = расщепленная [1] – Samah

Смежные вопросы