Python:向脚本传递参数

7 投票
3 回答
35056 浏览
提问于 2025-04-18 01:14

我有一段代码,可以从一个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])

我该如何把这个脚本做成可以接受参数的形式,让它能够接收 filename(文件名)、col(列名)和 sample(比如说100个值)呢?

3 个回答

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()
13

使用 argparse 模块:

argparse 模块让你写出用户友好的命令行界面变得简单。程序会定义它需要哪些参数,然后 argparse 会从 sys.argv 中提取这些参数。这个模块还会自动生成帮助信息和使用说明,并在用户输入无效参数时给出错误提示。

它非常强大:你可以指定帮助信息、进行验证、提供默认值……只要你能想到的与命令行参数相关的功能,它都能做到。

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])
20

你可以像这样使用sys模块,把命令行参数传递给你的Python脚本。

import sys

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

然后你的命令行看起来会是:

./myscript.py 10 100

撰写回答