15

This seems like a straight-forward question but I can't seem to pinpoint my problem. I am trying to delete all lines in a file that start with an octothorpe (#) except the first line. Here is the loop I am working with:

for i, line in enumerate(input_file):
    if i > 1:
        if not line.startswith('#'):
            output.write(line)

The above code doesn't seem to work. Does anyone known what my problem is? Thanks!

drbunsen
  • 10,139
  • 21
  • 66
  • 94

3 Answers3

19

You aren't writing out the first line:

for i, line in enumerate(input_file):
    if i == 0:
        output.write(line)
    else:
        if not line.startswith('#'):
            output.write(line)

Keep in mind also that enumerate (like most things) starts at zero.

A little more concisely (and not repeating the output line):

for i, line in enumerate(input_file):
    if i == 0 or not line.startswith('#'):
        output.write(line)
Ned Batchelder
  • 364,293
  • 75
  • 561
  • 662
  • 1
    Thanks for your patience. Your answer solved my problem. I greatly appreciate the help and thanks for showing me how to use the `or not` statement! – drbunsen Aug 08 '11 at 17:17
10

I wouldn't bother with enumerate here. You only need it decide which line is the first line and which isn't. This should be easy enough to deal with by simply writing the first line out and then using a for loop to conditionally write additional lines that do not start with a '#'.

def removeComments(inputFileName, outputFileName):

    input = open(inputFileName, "r")
    output = open(outputFileName, "w")

    output.write(input.readline())

    for line in input:
        if not line.lstrip().startswith("#"):
            output.write(line)

    input.close()
    output.close()

Thanks to twopoint718 for pointing out the advantage of using lstrip.

Dunes
  • 37,291
  • 7
  • 81
  • 97
4

Maybe you want to omit lines from the output where the first non-whitespace character is an octothorpe:

for i, line in enumerate(input_file):
    if i == 0 or not line.lstrip().startswith('#'):
        output.write(line)

(note the call to lstrip)

Chris
  • 3,000
  • 26
  • 43
  • Thanks for pointing out the use of `lstrip`method. In my case, there is never whitespace before the octothorpe, so I think I am safe with just the `startswith` method. – drbunsen Aug 08 '11 at 18:12
  • This doesn't write the first line. – smci Aug 08 '11 at 20:31
  • @smci I assumed that skipping the first line was the intentional and expected behavior: "I am trying to delete all lines in a file that start with an octothorpe (#) except the first line". I'll change mine to mirror Ned's above. – Chris Aug 09 '11 at 00:59