1

如何通过 Python 使以下一行打印每个文件?

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

具体想知道如何通过管道输入python -c。接受 DOS 或 Cygwin 响应。

4

6 回答 6

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`
于 2009-03-04T23:47:33.473 回答
5

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

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

目前还不完全清楚你想做什么(也许我很愚蠢)。混淆来自您的示例,该示例将数据从 python 脚本中传递出来。

于 2009-03-05T00:06:43.847 回答
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。

于 2009-03-05T00:15:53.997 回答
3
ls | python -c "import sys; print sys.stdin.read()"

只需正常读取管道的标准输入

于 2009-03-05T00:29:16.477 回答
2

想知道如何管道虽然

你把管道弄错了,如果你想把'dir'的输出输入Python,'dir'必须在左边。例如。:

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

(使用列表理解的 hack 是因为您不允许在分号后的一行中使用块引入“for”语句。)

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

于 2009-03-05T00:44:18.780 回答
1

具体想知道如何通过管道输入 python -c

cobbal 的回答

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

一般来说,一个shell命令的形式

A | B

将 A 的输出重定向为 B 的输入

因此,如果 A 向标准输出吐出“asdf”,则 B 将“asdf”输入其标准输入

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

于 2009-03-05T09:12:06.987 回答