Python one-liner打印当前目录中的每个文件

时间:2009-03-04 23:45:09

标签: python cygwin cmd pipe

如何通过Python在每个文件中打印以下单行内容?

python -c "import sys;print '>>',sys.argv[1:]" | dir *.*

特别想知道如何管道进入python -c。 接受DOS或Cygwin的回应。

6 个答案:

答案 0 :(得分:6)

python -c "import os; print os.listdir('.')"

如果您想在问题中应用一些格式,

python -c "import os; print '\n'.join(['>>%s' % x for x in os.listdir('.')])"

如果您想使用管道,请使用xargs

ls | xargs python -c "import sys; print '>>', sys.argv[1:]"

或反叛:

python -c "import sys; print '>>', sys.argv[1:]" `ls`

答案 1 :(得分:4)

您可以通过读取sys.stdin来读取通过传输到 Python脚本中的数据。例如:

ls -al | python -c "import sys; print sys.stdin.readlines()"

你想做什么并不完全清楚(也许我很愚蠢)。混淆来自你的例子,它是从python脚本中输出数据。

答案 2 :(得分:4)

如果您要打印所有文件:

find . -type f

如果您只想打印当前目录的文件

find . -type f -maxdepth 1

如果您想加入“>>”每行之前

find . -type f -maxdepth 1 | xargs -L 1 echo ">>"

如果您不希望“>>”之间的空格和来自echo的$ path

find . -type f -maxdepth 1 | xargs -L 1 printf ">>%s\n"

当然,这都是使用cygwin。

答案 3 :(得分:3)

ls | python -c "import sys; print sys.stdin.read()"

只需正常读取stdin管道

答案 4 :(得分:2)

  

想知道怎么管道

你的管道方向错误,如果你想把'dir'的输出提供给Python,'dir'就必须在左边。例如:

dir "*.*" | python -c "import sys;[sys.stdout.write('>>%s\n' % line) for line in sys.stdin]"

(列表理解的黑客是因为你不允许在分号后的一行上引用'for'语句。)

显然,Python原生解决方案('os.listdir')在实践中要好得多。

答案 5 :(得分:1)

  

特别想知道如何管道进入python -c

请参阅cobbal's answer

从程序的角度来看,程序管道是透明的,所有程序都知道它是从标准输入流中获取的输入

一般来说,形式为

的shell命令
A | B

将A的输出重定向为B

的输入

所以如果A将“asdf”吐出到标准输出,那么B将“asdf”输入其标准输入

python中的标准输入流是sys.stdin