2014-04-03 194 views
0

我有一个工作代码来打印csv列的随机行。Python:将参数传递给脚本

#!/usr/bin/python 

import csv 

import random 

**col**=2 

with open('<filename>','r') as f: 
     reader=csv.reader(f) 
     data=[row[col] for row in reader] 
    from random import shuffle 
    shuffle(data) 
    print '\n'.join(data[:**100**]) 
    f.close(); 

我想参数化这个脚本。通过通过,位置(col)&样本(例如100个值)

我无法找到一个体面的教程来解释这一点。有什么想法吗 ?

+3

尝试https://docs.python.org/2/library/argparse.html#module-argparse,或http://www.pythonforbeginners.com/system/蟒蛇-SYS-argv的。 – wflynny

+1

我不是你的downvoter,而是尝试'import sys; print sys。argv' –

+0

Downvoted:“我无法找到一个体面的教程来解释这个问题” - 对不起,但这不是懒惰或严重缺乏谷歌技能。您可以简单地[将您的问题的标题复制到Google](https://www.google.com/search?q=Python%3A+pass+arguments+to+a+script&ie=utf-8&oe=utf-8)并获得大量有用的教程;事实上,10个第一个结果中的任何一个都能回答你的问题。 – l4mpi

回答

3

您可以像这样使用sys模块将命令行参数传递给您的python脚本。

import sys 

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

,然后你的命令行是......

./myscript.py 10 100

+0

感谢Genome。有没有一种方法来合并解析或错误处理? – sumoka

+0

没问题。 Alecxe为更强大的命令行参数处理提供了一个很好的选择。 – Genome

1

使用argparse模块:

的argparse模块可以很容易地写用户友好的命令行接口 。该程序定义了它需要的参数,并且argparse将找出如何解析sys.argv中的那些参数。参数 argparse模块也会自动生成帮助和使用消息 ,并在用户给出程序无效参数时发出错误。

它功能非常强大:您可以指定帮助信息,进行验证,提供默认设置......无论您怎样想象使用命令行参数。

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 

下面是在命令行:

$ 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 

谈到您所提供的代码:

  • 未使用import random声明
  • 移动from random import shuffle到剧本顶部
  • 不需要调用f.close()(尤其是;) - with手柄关闭文件自动地

下面的代码会是什么样子的修正后:

#!/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]) 
+0

谢谢alecxe。不幸的是2.6.6没有argparse模块。有没有其他方式我喜欢这种存储和解析变量的风格。 – sumoka

+0

@sumoka当然,从PyPi安装它:http://stackoverflow.com/questions/15330175/how-can-i-get-argparse-in-python-2-6 – alecxe

0

谢谢你们。

由于缺乏权限,我无法安装argaprse - 与此同时。

这里的解决方案 -

#!/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()