2012-08-13 61 views
0

我在Linux(Ubuntu 11.10)機器上運行;伯恩再次殼。在許多文件上運行python腳本的問題

我必須用python腳本處理一個完整的文件目錄。我的同事編寫了python腳本,並且我之前成功地將它用於一個文件。它有兩個參數:一個用引號括起來的文件處理路徑和一個名爲-min的二級參數,它需要一個整數。此外,腳本寫入標準輸出。

從我的shell腳本的經驗,在這個論壇上跟隨他人,我用下面的方法來遍歷文件的目錄:

for f in path/to/data_directory/*; do 
    path/to/pythonscript.py $f -min 1 > path/to/out_directory/$f; 
done 

我得到的out_directory所需的文件名。每個內容都是隻有python腳本可以編寫的內容。也就是說,上面的for循環成功地將文件傳遞給腳本。但是,每個文件內容的性質都是完全錯誤的(如腳本所做的計算錯誤)。當我在data_directory中的一個文件上運行python腳本時,輸出文件具有正確的內容(由腳本執行的計算是正確的)。

讓它更復雜的事情是,同樣的shell方法(for循環)在我的同事的Mac OS X中完美工作。

問題在哪裏?我是否缺少一些關於Linux shell的基礎知識?也許這是一個語法錯誤?

任何幫助將不勝感激。

更新:我只是再次運行for循環,但不是將它指向文件的data_directory,而是將它指向data_directory中的文件。我有同樣的問題 - python腳本沒有計算出正確的結果。

+1

Upvote究竟是什麼? – 2012-08-13 04:17:52

+0

您爲單個文件運行的命令是什麼?請給我們一個例子。 – Yamaneko 2012-08-13 04:33:13

+0

'path/to/pythonscript.py'path/to/data_directory/10000.original_indels.ss'-min 1> path/to/out_directory/10000.original_indels.ss' – nnarula 2012-08-13 04:34:27

回答

1

我看到的唯一問題是,文件名可能包含空格 - 所以你應該引用文件名:

for f in path/to/data_directory/*; do 
    path/to/pythonscript.py "$f" -min 1 > "path/to/out_directory/$f" 
done 
+0

謝謝。我回去檢查文件名並且沒有空白。 '10000.original_indels.ss'是要處理的數據文件的一個例子。我希望這沒有錯。 – nnarula 2012-08-13 04:27:55

+0

@nnarula你真的嘗試過Maulwurfn的劇本嗎?因爲他也包括整個路徑。你的shell代碼似乎取決於當前目錄是什麼......也許你是從一個文件夾中運行的,該文件夾至少有一些與數據目錄中相同的文件名,但具有不同的數據(這就是爲什麼計算錯誤) 。 – azhrei 2012-08-13 04:38:19

+0

@azhrei是的,我得到了同樣的結果。我坐在'data_directory','out_directory'和包含python腳本的目錄之上的一個目錄。另外,由於我最終要處理的數據文件的數量,我確保在我工作的目錄中沒有數據文件或出文件。 – nnarula 2012-08-13 04:41:55

0

好吧,我不知道如果這有助於但是。

path/to/pythonscript.py $f -min > path/to/out_director/$f 

替補出

path/to/pythongscript.py path/to/data_directory/myfile -min 1 > path/out_directory/path/to/data_directory/myfile 

腳本應該

cd path/to/data_directory 
for f in *; do 
path/to/pythonscript.py $f -min 1 > path/to/out_directory/$f 
done 

您運行的是什麼版本的bash?

如果你運行這個腳本,你會得到什麼?

cd path/to/data_directory 
for f in *; do 
echo $f > /tmp/$f 
done 

當然,這應該會給你一堆包含自己文件名的文件。

+0

是的,我第一次嘗試腳本時遇到了這個錯誤。 Bash說'path/to/out_directory/path/to/data_directory/myfile'不存在。我通過在out_directory中創建一個名爲data_directory的目錄來解決這個問題[正如我在上面的註釋中所解釋的,我坐在data_directory,out_directory和包含python腳本的目錄之上的一個目錄]。我的bash版本是GNU bash,版本4.2.10(1)-release(x86_64-pc-linux-gnu)。 是的,最後一個腳本的輸出正是你所說的。 – nnarula 2012-08-13 04:54:06

+0

您已驗證for循環中的一個或幾個文件失敗的直接命令。不只是同一個文件。這可能是一個python問題。 – Codeguy007 2012-08-13 05:00:52

+0

是的,我現在正在data_directory中使用5個文件進行測試,並且我已經單獨測試了python腳本,沒有對每個腳本使用'for'循環。 python腳本成功運行。我也用另一套替換了5個文件。同樣的情況。 – nnarula 2012-08-13 05:13:42