Python - ignore lines in a file

25,878

Solution 1

startswith can take a tuple of strings to match, so you can do this:

[line.strip().split() for line in z if not line.startswith(('a', 'b'))]

This will work even if a and b are words or sentences not just characters. If there can be cases where lines don't start with a or b but also don't end with c you can extend the list comprehension to this:

[
    line.strip().split()
    for line in z if line.endswith('c') and not line.startswith(('a', 'b'))
]

Solution 2

One very general approach is to "filter" the file by removing some lines:

import itertools
zlist = [l.strip.split() for l in itertools.ifilter(lambda line: line[0] not in 'ab', z)]

You can use itertools.ifilter any time you want to "selectively filter" an iterable, getting another iterable which only contains those items which satisfy some predicate -- which is why I say this approach is very general. itertools has a lot of great, fast tools for dealing with iterables in a myriad way, and is well worth studying.

A similar but syntactically simpler approach, which suffices in your case (and which therefore I would recommend due to the virtue of simplicity), is to do the "filtering" with an if clause in the listcomp:

zlist = [l.strip.split() for l in z if l[0] not in 'ab']

Solution 3

You can add if conditions to list comprehensions.

z_list = [i.strip().split() for i in z if i[-1] == 'c']

or

z_list = [i.strip().split() for i in z if (i[0] <> 'a' and i[0] <> 'b')]

Solution 4

One way to do it is to replace 'pass' with 'continue'. This will continue to the next line in the file without doing anything. You will also need to append line to list_1

if line[-1] == 'c':
    list_1.append([line.strip().split()])
Share:
25,878
Darren J. Fitzpatrick
Author by

Darren J. Fitzpatrick

Updated on August 12, 2021

Comments

  • Darren J. Fitzpatrick
    Darren J. Fitzpatrick almost 3 years

    How does one ignore lines in a file?

    Example:

    If you know that the first lines in a file will begin with say, a or b and the remainder of lines end with c, how does one parse the file so that lines beginning a or b are ignored and lines ending c are converted to a nested list?

    What I have so far:

    fname = raw_input('Enter file name: ')
    
    z = open(fname, 'r')
    
    #I tried this but it converts all lines to a nested list
    
    z_list = [i.strip().split() for i in z]
    

    I am guessing that I need a for loop.

    for line in z:
        if line[0] == 'a':
            pass
        if line[0] == 'b':
            pass
        if line[-1] == 'c':
            list_1 = [line.strip().split()]
    

    The above is the general idea but I am expert at making dead code! How does one render it undead?