Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python - ignore lines in a file

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?

like image 847
Darren J. Fitzpatrick Avatar asked Nov 21 '25 04:11

Darren J. Fitzpatrick


2 Answers

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'))
]
like image 64
Nadia Alramli Avatar answered Nov 23 '25 19:11

Nadia Alramli


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']
like image 28
Alex Martelli Avatar answered Nov 23 '25 18:11

Alex Martelli



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!