0

基本上我正在运行mapreduce,所以我将通过管道进入reducer。我遇到的问题是如何指定一个目录路径,我将与 os.listdir 一起使用它来基本上访问然后单独计算该目录中的所有文件。但我知道我只想要最后一个目录中的内容,而不是同一级别的子目录。我也可以考虑使用 fileinput()。

我想我可能在这里使用了错误的标准输入,这取决于它是否必须来自命令行或者是否可以间接来自命令行。

这是我的命令行输入: "./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..
4

1 回答 1

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

这告诉使用参数bash执行程序。这几乎肯定不是您想要做的。./path1/path2/path3./map.py

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']
>>> 
于 2012-04-13T01:57:44.087 回答