Python:向脚本传递参数

4
我有一个可用的代码,可以从CSV列中打印随机行。
#!/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])

我应该如何通过传递filenamecolsample(例如100个值)来对这个脚本进行参数化?

1
可能是 Python 命令行参数 的重复问题。 - l4mpi
3个回答

15
你可以使用sys模块来将命令行参数传递给你的Python脚本。
import sys

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

然后你的命令行将是...
./myscript.py 10 100

谢谢 Genome。有没有办法在这里加入解析或错误处理? - sumoka
没问题。Alecxe提供了一个更强大的命令行参数处理选项。 - Genome
在简单情况下,当argparse过于复杂时,这个方法非常有效。太好了。 - undefined

13

使用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])

感谢alecxe。不幸的是,2.6.6版本没有argparse模块。还有其他方法吗?我喜欢这种存储和解析变量的方式。 - sumoka
@sumoka 确定,可以从 PyPi 安装它:https://dev59.com/OGUp5IYBdhLWcg3wXGoZ - alecxe

0

由于权限不足,我无法安装argparse - 与此同时。

以下是解决方案:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接