Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to skip multiple header lines using python

Tags:

python-2.7

I am new to python. Trying to write a script that will use numeric colomns from a file whcih also contains a header. Here is an example of a file:

@File_Version: 4
PROJECTED_COORDINATE_SYSTEM
#File_Version____________-> 4
#Master_Project_______->
#Coordinate_type_________-> 1
#Horizon_name____________-> 
sb+
#Horizon_attribute_______-> STRUCTURE
474457.83994    6761013.11978  
474482.83750    6761012.77069   
474507.83506    6761012.42160   
474532.83262    6761012.07251   
474557.83018    6761011.72342   
474582.82774    6761011.37433   
474607.82530    6761011.02524   

I'd like to skip the header. here is what i tried. It works of course if i know which characters will appear in the header like "#" and "@". But how can i skip all lines containing any letter character?

in_file1 = open(input_file1_short, 'r')
out_file1 = open(output_file1_short,"w")
lines = in_file1.readlines ()
x = []
y = []
for line in lines:
    if "#" not in line and "@" not in line:
        strip_line = line.strip()
        replace_split = re.split(r'[ ,|;"\t]+', strip_line)
        x = (replace_split[0])
        y = (replace_split[1])
        out_file1.write("%s\t%s\n" % (str(x),str(y)))
in_file1.close ()

Thank you very much!

like image 773
emin Avatar asked Jul 28 '26 07:07

emin


2 Answers

I think you could use some built ins like this:

import string
for line in lines:
    if any([letter in line for letter in string.ascii_letters]):
        print "there is an ascii letter somewhere in this line"

This is only looking for ascii letters, however.

you could also:

import unicodedata
for line in lines:
    if any([unicodedata.category(unicode(letter)).startswith('L') for letter in line]):
        print "there is a unicode letter somewhere in this line"

but only if I understand my unicode categories correctly....

Even cleaner (using suggestions from other answers. This works for both unicode lines and strings):

for line in lines:
    if any([letter.isalpha() for letter in line]):
        print "there is a letter somewhere in this line"

But, interestingly, if you do:

In [57]: u'\u2161'.isdecimal()

Out[57]: False

In [58]: u'\u2161'.isdigit()

Out[58]: False

In [59]: u'\u2161'.isalpha()

Out[59]: False

The unicode for the roman numeral "Two" is none of those, but unicodedata.category(u'\u2161') does return 'Nl' indicating a numeric (and u'\u2161'.isnumeric() is True).

like image 78
rkh Avatar answered Jul 30 '26 23:07

rkh


This will check the first character in each line and skip all lines that doesn't start with a digit:

for line in lines:
    if line[0].isdigit():
        # we've got a line starting with a digit
like image 44
razz Avatar answered Jul 31 '26 00:07

razz



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!