2014-09-28 50 views
-2

我敢肯定這是一個常見的問題,但我是這樣一個蟒蛇新手我不知道如何搜索問題。python:iteratively change sys.argv

我有像這樣的功能的腳本:

firstarg = sys.argv[1] 
secondarg = sys.argv[2] 

def examplefunc(firstarg): 
    #does something 
#returns something 

def example2(firstarg, secondarg): 
    #also does something and returns something 

我有一個的txt文件數量龐大的文件夾。對於第一個示例函數,我想遍歷所有這些txt文件,並將答案打印到一個新文件中(即將每個txt文件作爲firstarg傳遞)。同樣,對於第二個函數,我想將第一個參數固定爲一個特定的txt文件,並將第二個參數固定爲所有剩餘的txt文件。

我知道如何運行,像這樣的參數Python命令將在我的窗體的終端運行的東西,唯一的方法:

蟒蛇myscript.py ./txtfile1 ./txtfile2

然後相應地更改參數。我確定有更好的方法。誰能幫忙?

回答

1

如果你想獲得一個目錄中所有文件的列表,有兩種方法可以做到這一點。

首先,從Python的以外,只是這樣做:

python myscript.py txtfile1 * 

現在,你sys.argv將會像['myscript.py', 'txtfile1', 'txtfile1', 'txtfile2', 'txtfile3', 'txtfile4']。所以,如果你想在每一個文件運行examplefunc,然後在txtfile1運行example2對每個文件:

special_file = sys.argv[1] 
everything_else = sys.argv[2:] 
for filename in everything_else: 
    examplefunc(filename) 
for filename in everything_else: 
    example2(special_file, filename) 

但你也可以裏面 Python中做到這一點從。傳入目錄而不是一堆文件,如python myscript.py txtfile1 .。然後你sys.argv['myscript.py', 'txtfile1', '.'],你可以這樣做:

special_file = sys.argv[1] 
everything = os.listdir(sys.argv[2])) 
1

一開始,沒有通過文件名作爲參數。使用os.walk可以獲得目錄中所有.txt文件的列表,然後您可以輕鬆地讀取文件並在Python代碼中遍歷它們。

+2

,除非你真的想遞歸走路不要使用'os.walk'。使用'listdir'。 – abarnert 2014-09-28 22:17:58

0

好得多是通過反覆的每個文件的目錄從程序步驟:

import os 

def file_iterator(dir_to_traverse): 
    for path,dirs,files in os.walk(dir_to_traverse): 
     for f_name in files: 
      yield os.path.join(path,f_name) 
     break 

for file_name in file_iterator('.'): 
    print file_name 
+0

'。'指的是當前目錄。你可以指定任何目錄,如'C:\\ Documents and Settings \\ xx \\ My Documents \\ Some Dir',如果你在Windows上。請注意使用雙反斜槓,因爲單個反斜槓是用於打印特殊字符的字符串轉義字符。 – Moose 2014-09-28 22:24:21

+0

使用原始字符串或正斜槓通常首選在Windows上雙斜線。 – geoffspear 2014-09-28 22:31:08