sumoka
sumoka

Reputation: 167

Python: pass arguments to a script

I have a working code to print random lines from a csv column.

#!/usr/bin/python

import csv
from random import shuffle

filename = 'example.csv'
col = 2
sample = 100

with open(filename, 'r') as f:
    reader = csv.reader(f)
    data = [row[col] for row in reader]
    shuffle(data)
    print '\n'.join(data[:sample])

How can I parameterize this script by passing filename, col & sample (e.g. 100 values)?

Upvotes: 9

Views: 47969

Answers (3)

Genome
Genome

Reputation: 1236

You can use the sys module like this to pass command line arguments to your Python script.

import sys

name_of_script = sys.argv[0]
position = sys.argv[1]
sample = sys.argv[2]

and then your command line would be:

./myscript.py 10 100

Upvotes: 24

sumoka
sumoka

Reputation: 167

I could not install argparse due to lack of permission - meanwhile.

Here's the solution:

#!/usr/bin/python

import csv   # This will help us reading csv formated files.
import sys
import optparse #import optparse

from random import shuffle

parser=optparse.OptionParser()

# import options

parser.add_option('-f','--filename',help='Pass the csv filename')
parser.add_option('-p','--position',help='column position in the file',type=int)
parser.add_option('-s','--sample',help='sample size',type=int)

(opts,args) = parser.parse_args() # instantiate parser


# Program to select random values

with open('<filepath>'+opts.filename,'r') as f:
        reader=csv.reader(f)
        data=[row[opts.position] for row in reader]

        shuffle(data)

        #print '\n'.join(data[:opts.sample])

# create o/p file
file=open("<opfilename>.txt","w")
file.write('\n'.join(data[:opts.sample]))
file.close()

Upvotes: 0

alecxe
alecxe

Reputation: 474241

Use argparse module:

The argparse module makes it easy to write user-friendly command-line interfaces. The program defines what arguments it requires, and argparse will figure out how to parse those out of sys.argv. The argparse module also automatically generates help and usage messages and issues errors when users give the program invalid arguments.

It's pretty powerful: you can specify help messages, make validations, provide defaults..whatever you can imagine about working with command-line arguments.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-p", "--position", type=int)
parser.add_argument("-s", "--sample", type=int)

args = parser.parse_args()
col = args.position
sample = args.sample

print col
print sample

Here's what on the command-line:

$ python test.py --help
usage: test.py [-h] [-p POSITION] [-s SAMPLE]

optional arguments:
  -h, --help            show this help message and exit
  -p POSITION, --position POSITION
  -s SAMPLE, --sample SAMPLE

$ python test.py -p 10 -s 100
10
100
$ python test.py --position 10 --sample 100
10
100

Speaking about the code you've provided:

  • unused import random statement
  • move from random import shuffle to the top of the script
  • no need to call f.close() (especially with ;) - with handles closing the file automagically

Here's how the code would look like after the fixes:

#!/usr/bin/python
import argparse
import csv
from random import shuffle


parser = argparse.ArgumentParser()
parser.add_argument("-p", "--position", type=int)
parser.add_argument("-s", "--sample", type=int)

args = parser.parse_args()

with open('<filename>', 'r') as f:
    reader = csv.reader(f)
    data = [row[args.position] for row in reader]
    shuffle(data)
    print '\n'.join(data[:args.sample])

Upvotes: 15

Related Questions