简体   繁体   中英

Python - how to get last line in a loop

I have some CSV files that I have to modify which I do through a loop. The code loops through the source file, reads each line, makes some modifications and then saves the output to another CSV file. In order to check my work, I want the first line and the last line saved in another file so I can confirm that nothing was skipped.

What I've done is put all of the lines into a list then get the last one from the index minus 1. This works but I'm wondering if there is a more elegant way to accomplish this.

Code sample:

def CVS1():
  fb = open('C:\\HP\\WS\\final-cir.csv','wb')
  check = open('C:\\HP\\WS\\check-all.csv','wb')
  check_count = 0
  check_list = []
  with open('C:\\HP\\WS\\CVS1-source.csv','r') as infile:
    skip_first_line = islice(infile, 3, None)
    for line in skip_first_line:       
       check_list.append(line)
       check_count += 1
       if check_count == 1:
         check.write(line)

     [CSV modifications become a string called "newline"]

     fb.write(newline)

final_check = check_list[len(check_list)-1]
check.write(final_check)
fb.close()

If you actually need check_list for something, then, as the other answers suggest, using check_list[-1] is equivalent to but better than check_list[len(check_list)-1] .

But do you really need the list? If all you want to keep track of is the first and last lines, you don't. If you keep track of the first line specially, and keep track of the current line as you go along, then at the end, the first line and the current line are the ones you want.

In fact, since you appear to be writing the first line into check as soon as you see it, you don't need to keep track of anything but the current line. And the current line, you've already got that, it's line .

So, let's strip all the other stuff out:

def CVS1():
    fb = open('C:\\HP\\WS\\final-cir.csv','wb')
    check = open('C:\\HP\\WS\\check-all.csv','wb')
    first_line = True
    with open('C:\\HP\\WS\\CVS1-source.csv','r') as infile:
        skip_first_line = islice(infile, 3, None)
            for line in skip_first_line:       
                if first_line:
                    check.write(line)
                    first_line = False

                [CSV modifications become a string called "newline"]

                fb.write(newline)

            check.write(line)    
            fb.close()

You can enumerate the csv rows of inpunt file, and check the index, like this:

def CVS1():
    with open('C:\\HP\\WS\\final-cir.csv','wb') as  fb, open('C:\\HP\\WS\\check-all.csv','wb') as check, open('C:\\HP\\WS\\CVS1-source.csv','r') as infile:
        skip_first_line = islice(infile, 3, None)
        for idx,line in enumerate(skip_first_line):       
            if idx==0 or idx==len(skip_first_line):
            check.write(line)
            #[CSV modifications become a string called "newline"]
            fb.write(newline)

I've replaced the open statements with with block, to delegate to interpreter the files handlers

you can access the index -1 directly:

final_check = check_list[-1]

which is nicer than what you have now:

final_check = check_list[len(check_list)-1]

If it's not an empty or 1 line file you can:

my_file = open(root_to file, 'r')
my_lines = my_file.readlines()
first_line = my_lines[0]
last_line = my_lines[-1]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM