2010-07-13 96 views
5

,所以我有一個Python腳本,它接受文件名作爲命令的參數,並處理該文件上的每個文件運行。但是,因爲我有263個需要相同處理的文件,所以我想知道是否可以使用for循環修改命令參數部分,以連續運行文件夾中的所有文件?乾杯,週六修改Python腳本在一個目錄

編輯:

對系統參數的代碼是在這裏:

try: 
    opt_list, args = getopt.getopt(sys.argv[1:], 'r:vo:A:Cp:U:eM:') 

except getopt.GetoptError, msg: 
    print 'prepare_receptor4.py: %s' %msg 
    usage() 
    sys.exit(2) 

帶有「R」是文件需要處理的名稱和其他可選參數。我不知道如何用for循環修改它。

回答

9

作爲一個實際問題,你使用任何可能外殼有一定的語法,可以很容易地用於此。在bash,例如:

for f in *; do python myscript.py $f; done 

要真正做到這一點在Python,我建議構建你的程序使主碼是其中有一個參數,文件名的功能。

def process(filename): 
    ...code goes here... 

然後,你可以調用這個函數像這樣,

for f in os.listdir(folder): 
    process(f) 

folder可以作爲命令行參數傳遞,或者只是寫入腳本(如果它不是東西,你會被重用)。

編輯:在回答你的編輯,我建議只給文件名作爲普通的命令行參數,而不使用-r選項,這樣他們就會在args風。然後,你可以做

for f in args: 
    process(f) 

,或者如果你寧願通過目錄名稱作爲命令行參數,

for d in args: 
    for f in os.listdir(d): 
     process(f) 

另外,我想你可以通過-r選項的多個實例,然後做

for opt, arg in opt_list: 
    if opt == '-r': 
     process(arg) 
+0

歡呼聲中,我試圖修改代碼(樂趣和經驗),但最終打破它......所以我用for循環在bash裏工作的一種享受!星期六 – 2010-07-14 19:47:05

1

是的,你可以修改它這樣。循環參數而不是索引第一個元素。

4

os.walk()聽起來像它可能在這裏工作。

def traverse_and_touch(directory, touch): 
    ''' 
    General function for traversing a local directory. Walks through 
    the entire directory, and touches all files with a specified function. 
    ''' 
    for root, dirs, files in os.walk(directory): 
    for filename in files: 
     touch(os.path.join(root, filename)) 
    return 

現在,你需要做的就是傳入你想要遍歷的目錄和一個函數,它會在每個文件上執行代碼。

os.walk()也遍歷所有子目錄。

3

當我在多個文件/文件夾的工作,我通常使用os.walk:

import os 
for root, dirs, files in os.walk(dir): 
    for fname in files: 
     do_something(fname) 

從getopt的或optparse讓您的目錄。 另外,如果您需要,可以使用os.path.abspath構建絕對路徑。

current_file = "%s%s%s" % (os.path.abspath(root), os.path.sep, fname) 
do_something(current_file) 
1

我建議你的'主'應該處理每個文件後給出的選項。也就是說,在「args」變量中。不要用「-r」傳遞路徑,這會限制你的靈活性。如果你在程序中使用os.walk()等,你需要系統只在文件樹上工作,這使得定製和開發更加困難。

如果程序與路徑列表一起工作,它很容易以不同的方式使用。例如,您可以列出一個數據文件進行測試。要處理目錄,請執行「myprogram dir/*。dat」。處理文件樹使用反引號:

myprogram `find . -name "*.dat"` 

最後,您可以做非常便宜的並行處理。喜歡的東西:你的程序的

find . -name '*.dat' | xargs -P 5 myprogram 

五份並行運行。無需鎖定或分叉或線程或其他同步。

(以上假設你是一個Linux/OSX類型的系統上。)