2012-04-13 47 views
0

基本上我正在運行mapreduce,所以我要管道進入減速機。我遇到的麻煩是如何指定一個目錄路徑,我將與os.listdir一起使用,以實質上獲得並計算單個目錄中的所有文件。但我知道我只想要最後一個目錄中的內容,而不是同一級別上的子目錄。我可能會考慮使用fileinput()。當使用一個python文件傳送到另一個文件時,可以將stdin與argv一起使用嗎?

我想我可能在這裏使用stdin錯誤,取決於它是否必須從命令行或者它是否可以間接從命令行。

這是我的命令行輸入:「./path1/path2/path3」./map.py |排序| ./red.py

我作爲一個錯誤我去做我想做的是-bash,不是目錄./pythonfile.py

使用Python 2.7.2

這是什麼我做:

def func(): 
    path = sys.argv[0] 
    return [filenames for filenames in os.listdir(path)if os.path.isfile(os.path.join(path,filenames))] 

if func() is not None: 
    for file in func(): 
     sys.stdin.read() 
     ...etc.. 

回答

1
"./path1/path2/path3" ./map.py | sort | ./red.py 

這告訴bash的說法./map.py執行程序./path1/path2/path3。這幾乎肯定不是你想要做的。

path = sys.argv[0] 

這是腳本的名字 - 的argv[]第一個元素是,按照慣例,正在執行的程序的名稱。看到這一點:

$ cat echo.py 
#!/usr/bin/python 
import sys 
print sys.argv[0] 
$ chmod 755 echo.py 
$ ./echo.py 
./echo.py 
$ 

也許你打算做什麼echo字符串的腳本:

echo path1/path2/path3 | ./map.py | sort | ./red.py 

但你不能使用argv[]陣列在它得到容易。事實上,這是非常很難正確地從這樣的自由形式的輸入解析多個路徑名,所以我會避免它完全,並通過名稱作爲參數

./map.py path1/path2/path3 /a/s/econd/pathname 

你可以遍歷在使用類似這樣的參數傳遞的所有路徑上:

>>> a=["nothing", "passwd", "shadow"] 
>>> [f for f in a[1:]] 
['passwd', 'shadow'] 
>>> import os 
>>> [f for f in a[1:] if os.path.isfile(f)] 
['passwd', 'shadow'] 
>>> 
+0

冒號的目的是什麼?謝謝,但我確定我基本上想要回顯腳本的路徑,那麼如何解析多個路徑名以達到我的上一個完整文件目錄?我不確定我是否理解你的元組或列表的例子,因爲我不知道要傳入的文件名。就參數而言,如果我以這種方式使用它,仍然可以以我需要的方式使用管道,並且是以相同的方式收到的論據?通過stdin或argv? – Nightvein 2012-04-13 02:15:12

+1

啊,'[1:]'是省略第一項,因爲它只是腳本的名字。 (不是路徑)。我必須運行,但考慮到我使用'a'進行簡單測試,用戶將通過'argv [1]','argv [2]'等提供值。 – sarnold 2012-04-13 02:40:23

相關問題