$ python nline.py
Output n longest lines from file
Syntax: nline.py [n] [filename]
$ cat string.txt
The quick
brown fox
jumps over
the lazy
dog
$ python nline.py 2 string.txt
brown fox
jumps over |
import sys
# offer command line help, parse command line arguments,
if len(sys.argv) < 3:
print "Output n longest lines from file"
print "Syntax:", sys.argv[0], "[n] [filename]"
sys.exit(2)
n = int(sys.argv[1])
fname = sys.argv[2]
# attempt to open file
try:
file = open(fname, "r")
except:
print "Error: can not open", fname, "for reading"
sys.exit(1)
# first pass, detect line length, build list[line #][line length]
list = []
fline_n = 0
while file:
fline = file.readline()
if fline == "":
break;
list.append((fline_n, len(fline)))
fline_n = fline_n + 1
# sort by line length, requires swaping values for each list pair
list = [(v, k) for k, v in list]
list.sort()
# determine how many lines to skip in final output
if len(list) <= n:
o = 0
else:
o = len(list) - n
# remove one list element for each line to be skipped
while o:
del list[0]
o = o - 1
# sort by line number, requires swaping values for each list pair
list = [(v, k) for k, v in list]
list.sort()
# second pass, read file and only output lines that are still included in list
fline_n = 0
list_n = 0
file.seek(0)
while file:
fline = file.readline()
if fline == "":
break;
if (list_n < n) and (list[list_n][0] == fline_n):
print fline,
list_n = list_n + 1
fline_n = fline_n + 1
file.close() |