Search code examples
pythonpython-3.xfile-handling

How to print only the start and endtime from a time log file(txt file) in python 3.8.10


This is the code I am using and I am getting partial output

def main():
    with open('time.txt') as f:
        linenumber=0
        for lines in f:
            a=f.readlines()
            for i in range(0,len(lines)):
                print(a[i].split()[1],a[i].split()[3])
            #print (a[i])
            


if __name__=='__main__':
    main()

The txt file consists of the following elements: time.txt

and the output i am getting is output

here in the output the program is not printing till the end of the txt file , it is only printing till a certain line and stopping . dont know the reason.


Solution

  • Say you have a file called time.txt with the following contents that you know is VALID:

    Time Log:
    2/23/12: 9:10pm - 11:40pm getting familiar with Flash
    2/29/12: 12:50pm - 2:00pm getting familiar with Flash
    3/1/12: 6:00pm - 11:40pm getting familiar with Flash
    3/3/12: 3:00pm - 7:00pm step-debug Energy Game code
    3/4/12: 8:00pm - 11:40pm start carbon game
    3/5/12: 2:00pm - 3:00pm
            4:00pm - 4:30pm carbon game
    3/6/12: 11:30am - 1:30pm carbon game data structures and classes for the first action
    3/7/12: 11:00am - 5:00pm tested basic concept
    3/8/12: 1:00am - 1:30am changed vector calling,
            10:30am - 2:30pm
            4:00pm - 5:00pm wrote code to draw points indicator and marshal the data code;
    3/9/12: 12:00am - 2:30am added CarbonActionCategoryView.as and captured some icons 
             11:30am - 4:50pm research how to resize; labor work to capture icons; research how to use event/delegate;
    3/10/12: 1:50am - 6:00am event/delegate alternative implementation; score fields implementation
             10:40am - 1:00pm define CarbonConsts.as for those names; implemented points fields
    3/12/12: 10:45am - 5:00pm research on scrollpane, to no avail
    3/13/12: 11:00am - 5:00pm research on Slider customization and make some progress without fully satisfication
    3/14/12: 12:10pm - 5:00pm continue to research on Slider and got some idea
    3/15/12: 3:30am - 4:30am experiment with CarbonSlider concept
             11:00am - 5:00pm "Flash Training with Paul Trani" and continue to experiment with CarbonSlider concept
    3/16/12: 10:00am - 5:00pm integrate the CarbonSlider class into the Game project
             8:00pm - 9:00pm added the display of the slider thumb value; 
             9:30pm - 11:00pm clean-up the resources and adjust slider.x; start to modify CarbonPointsIndicator.as
    3/17/12: 6:00am - 7:00am 
             12:00pm - 12:50pm
             4:00pm - 7:00pm bad CarbonPointsIndicator modification
    3/18/12: 9:10am - 9:40am draw 2-pixels rectangle and 1-pixel tick for Points Indicator
             9:40am - 10:30am debug biofueled cars & trucks, mix in wood in coal plants
             11:30am - 3:30pm scrollpane implementation - alternative
             11:00pm - 12:00am read Adobe Flash Professional online help
    3/19/12: 5:00am - 6:00am read Adobe Flash Professional online help
    3/20/12: 9:00am - 10:00am discuss with Dr. Lant and Blanca.
             10:00am - 11:00am slider width will be proportional per page or section, total score is changed to total carbon points, options remaining tops 100
    3/23/12: 1:30pm - 3:30pm install Adobe Illustrator
             4:00pm - 5:00pm Flash Professional online help
    3/29/12: 3:11am - 7:00am background shape study, to no avail
             11:00am - 12:50pm continue background shape study - no longer needed
             3:00pm - 5:05pm scroll pane automatically adjusted based on the view size; dynamically created static texts
             10:25pm - 11:00pm adjust positions of text fields
    3/30/12: 9:50am - 11:30am loading images in AS 3 training; flash work cycle training
             11:40am - 2:20pm experiment with ideas; learn illustrator
             3:20pm - 5:05pm re-captured all .png files; .ai files do not have any advantage over .png files
    3/31/12: 7:00am - 9:00am change the color of points indicator; add PPU; use Bitmap instead of MovieClip;
    4/2/12: 12:10pm - 1:42pm study mask and Shape; come up with the concept of carbon progressbar 
            1:43pm - 5:00pm implement the carbon progressbar using mask and shape
            7:00pm - 7:40pm implement the carbon progressbar by drawing bar and outline
            11:00pm - 12:05am added total options and options
    4/3/12: 1:30am - 3:00am added Options In Total static text field; Options Remaining will not go negative.
    4/4/12: 3:50pm - 5:00pm update the icons
            8:35pm - 11:50pm continue to update the icons; use the colors in .ai file
    4/9/12: 12:30pm - 6:00pm update based on feedback
            9:50pm - 2:30am
    4/10/12: 8:56am - 9:57am
            - 10.remove "other"
            - 9. add "Replace Cement"
            - 8. move current points slightly to the right
            - 7. center max points on last tic mark
            - 6. provide a bit more white space for four large boxes at the top
            - 5. At top of left-hand column, label boxes "Tons of Carbon per unit"
            - 4. PPU boxes. Align vertically. Expand. "Points per Unit" at the top of this column. 
            - 3. decrease Improve Insulation limit from 20 to 15
            - 2. optionsRemaining and optionsUsed
            - 1. total carbon points bar
    5/19/12: 4:03pm - 6:57pm update based on teachers' feedback and dynamically dragging slide
    6/4/12: 3:30pm - 5:04pm prev/more options implementation
            8:15pm - 10:00pm
    3/13/13: 2:11pm - 5:12pm Make numbers in the yellow triangles bigger and bolder; Make numbers in the options used and remaining bigger and bolder
    

    You could utilize a helper function to check if the possible parts of a line for a "starttime", end with am or pm:

    def is_time(s: str) -> bool:
        return s.endswith('am') or s.endswith('pm')
    
    def main() -> None:
        with open('time.txt', 'r') as log_file:
            next(log_file)  # Skip first line.
            for line in log_file:
                line_parts = line.split()
                if line_parts[0].count('/') == 2:  # Line starts with a date.
                    if is_time(line_parts[1]):
                        print(' '.join(line_parts[1:4]))
                else:
                    if is_time(line_parts[0]):
                        print(' '.join(line_parts[0:3]))
    
    if __name__ == '__main__':
        main()
    

    Output:

    9:10pm - 11:40pm
    12:50pm - 2:00pm
    6:00pm - 11:40pm
    3:00pm - 7:00pm
    8:00pm - 11:40pm
    2:00pm - 3:00pm
    4:00pm - 4:30pm
    11:30am - 1:30pm
    11:00am - 5:00pm
    1:00am - 1:30am
    10:30am - 2:30pm
    4:00pm - 5:00pm
    12:00am - 2:30am
    11:30am - 4:50pm
    1:50am - 6:00am
    10:40am - 1:00pm
    10:45am - 5:00pm
    11:00am - 5:00pm
    12:10pm - 5:00pm
    3:30am - 4:30am
    11:00am - 5:00pm
    10:00am - 5:00pm
    8:00pm - 9:00pm
    9:30pm - 11:00pm
    6:00am - 7:00am
    12:00pm - 12:50pm
    4:00pm - 7:00pm
    9:10am - 9:40am
    9:40am - 10:30am
    11:30am - 3:30pm
    11:00pm - 12:00am
    5:00am - 6:00am
    9:00am - 10:00am
    10:00am - 11:00am
    1:30pm - 3:30pm
    4:00pm - 5:00pm
    3:11am - 7:00am
    11:00am - 12:50pm
    3:00pm - 5:05pm
    10:25pm - 11:00pm
    9:50am - 11:30am
    11:40am - 2:20pm
    3:20pm - 5:05pm
    7:00am - 9:00am
    12:10pm - 1:42pm
    1:43pm - 5:00pm
    7:00pm - 7:40pm
    11:00pm - 12:05am
    1:30am - 3:00am
    3:50pm - 5:00pm
    8:35pm - 11:50pm
    12:30pm - 6:00pm
    9:50pm - 2:30am
    8:56am - 9:57am
    4:03pm - 6:57pm
    3:30pm - 5:04pm
    8:15pm - 10:00pm
    2:11pm - 5:12pm
    

    To calculate the total hours you could parse each time interval into a timedelta:

    from datetime import datetime, timedelta
    
    def is_time(s: str) -> bool:
        return s.endswith('am') or s.endswith('pm')
    
    def parse_12_hour_time(time: str) -> datetime:
        return datetime.strptime(time, '%I:%M%p')
    
    def get_timedelta(start_time: str, end_time: str) -> timedelta:
        return parse_12_hour_time(end_time) - parse_12_hour_time(start_time)
    
    def timedelta_to_hours(td: timedelta) -> float:
        return td.total_seconds() / 3600
    
    def main() -> None:
        total_hours = 0
        with open('time.txt', 'r') as log_file:
            next(log_file)  # Skip first row.
            for line in log_file:
                line_parts = line.split()
                if line_parts[0].count('/') == 2:  # Line starts with a date.
                    if is_time(line_parts[1]):
                        td = get_timedelta(line_parts[1], line_parts[3])
                        total_hours += timedelta_to_hours(td)
                else:
                    if is_time(line_parts[0]):
                        td = get_timedelta(line_parts[0], line_parts[2])
                        total_hours += timedelta_to_hours(td)
        print(f'{total_hours = :.2f}')
    
    if __name__ == '__main__':
        main()
    

    Output:

    total_hours = 74.38