2014-04-03 238 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()