如何使用python从文件中分割每一行?

2024-06-28 11:38:31 发布

您现在位置: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]是第二行,以此类推。。。。我怎么能一次只读一行,把它的内容分成几行去做一些事情,其他几行也一样。你知道吗

更新我的问题:完整代码:

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()

我从这个代码的目的是:检查当前时间与每一行,当当前行在范围内的“第一行”//做一些事情,这就像制定时间表或报警。你知道吗

错误是:

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年4月14日,所以为什么不正确??我很困惑

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

感谢每一个帮助我的人:帕德雷克·坎宁安和其他人


Tags: indateiftimechecklinenowsplit
2条回答

使用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("")

通过逐行加载到内存中,这是读取文件最有效的方法。你知道吗

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)

相关问题 更多 >