如何使用sys.stdin运行代码作为多个文本文件的输入

时间:2017-04-22 01:49:51

标签: python python-2.7

我在我的代码中使用sys.stdin,我想知道如何在多个文本文件上测试我的代码。 我的代码(test.py)是:

for line in sys.stdin:
   line = line.strip()
   words = line.split()

我正在尝试在2个文本文件上测试它,所以我输入终端:

echo "test1.txt" "test2.txt" | test.py

但它不起作用,所以我只想知道如何在2个文本文件上测试代码?

1 个答案:

答案 0 :(得分:1)

echo "test1.txt" "test2.txt" | test.py

实际上不会运行test.py,而是需要使用此命令:

echo "test1.txt" "test2.txt" | python test.py

然而,另一种获取python参数的方法是:

import sys
for arg in sys.argv:
    print line

当这样运行时:

python test.py "test1" "test2"

产生以下输出:

test.py
test1
test2

argv的第一个参数是程序的名称。这可以跳过:

import sys
for arg in sys.argv[1:]:
    print line

你似乎遇到的另一个问题是你假设python正在打开你在循环中处理它的文本文件 - 这不是真的。如果你在循环中打印,你会看到它只打印你最初给它的字符串。

如果您确实想要打开并解析文件,请在循环中执行以下操作:

import sys

args = sys.stdin.readlines()[0].replace("\"","").split()
for arg in args:
    arg = arg.strip()
    with open(arg, "r") as f:
        for line in f:
            line = line.strip()
            words = line.split()

我们有这个奇怪的第一行的原因是stdin是一个流,所以我们必须通过readlines()读取它。

结果是一个包含单个元素的列表(因为我们只给了它一行),因此[0]

然后我们需要删除内部引号,因为在管道时不需要引号,这也可以工作:

echo test1.txt test2.txt | python test.py

最后,我们必须将字符串拆分为实际的文件名。