#!/usr/bin/env python # # Copyright 2015 Ville Rantanen # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # '''simple head for tsv/csv files.''' __author__ = "Ville Rantanen " __version__ = "0.1" import sys,os,argparse from argparse import ArgumentParser def setup_options(): ''' Create command line options ''' usage=''' Simple implementation of head that keeps the header row. ''' parser=ArgumentParser(description=usage, formatter_class=argparse.RawDescriptionHelpFormatter, epilog="\n".join(["Version: "+__version__,__author__])) common_group=parser.add_argument_group('common', 'Common options') common_group.add_argument("-v","--version",action="version",version=__version__) common_group.add_argument("-n",type=int,dest="lines",default=False, help="Lines to show from beginning of file. Negative value to show lines but the number. Default: 10") parser.add_argument("file",type=str, nargs='*', help="File(s) to be headed") opts=parser.parse_args() if not opts.lines: try: int(opts.file[0]) opts.lines=int(opts.file.pop(0)) except: pass if not opts.lines: opts.lines=10 return opts def behead(fileob,opts): header=fileob.readline() sys.stdout.write(header) if opts.lines>=0: head_ordinary(fileob, opts.lines) else: head_allbutlast(fileob, opts.lines) def head_ordinary(fileob, lines): for i,row in enumerate(fileob): if i>lines-1: break sys.stdout.write(row) def head_allbutlast(fileob, lines): lines=-lines buf=[] for row in fileob: buf.append(row) if len(buf)>lines: sys.stdout.write(buf.pop(0)) def main(): opts=setup_options() try: if (not sys.stdin.isatty()): behead(sys.stdin, opts) for fi in opts.file: behead(open(fi,'r'), opts) except IOError as (n,e): if n==32: pass else: import traceback print traceback.format_exc() except KeyboardInterrupt: pass if __name__ == "__main__": main()