为什么不<从命令行读取文件(简单的Python代码)?

Wor*_*ire 2 python command-line file input

我有一个简单的程序,读取数字并返回它们排序:

import sys

myset = set()
arguments = sys.argv[1:]

for x in arguments:
    myset.add(int(x.rstrip()))


newset = sorted(myset)
print ("sorted")

for x in newset:
    print x
Run Code Online (Sandbox Code Playgroud)

当我键入"python pysortints.py 1 5 6 7 2 6 7 254 2 543"时,它工作得很好,但是当我尝试类似"python pysortints.py <testfile"(当testfile是纯数字的行)时,什么都没有出来除了一些打印语句("已排序").

有任何想法吗?为了以防万一我在x上尝试了rstrip,但它似乎没有做任何事情.

the*_*eye 8

当你这样做

pysortints.py < testfile
Run Code Online (Sandbox Code Playgroud)

testfile标准输入中的内容变为可用,而不是命令行参数.

因此,您需要使用raw_input(如果您使用的是Python 2.x)或input(如果您使用的是Python 3.x)函数来读取数据.

或者,您可以直接从中读取sys.stdin,就像这样

import sys
for x in sys.stdin:
    myset.add(int(x))
Run Code Online (Sandbox Code Playgroud)

注意:您不需要删除传递给int函数的字符串数据.它将忽略开头和结尾处的空白字符,为你:)

让我们稍微改进一下代码.您的目的是只找到唯一的元素并对它们进行排序.因此,您可以使用set comprehension,而不是向集合中添加元素

{int(line) for line in sys.stdin}
Run Code Online (Sandbox Code Playgroud)

这将获得int类型中的所有唯一元素.接下来,您可以简单地应用于sorted

print sorted({int(line) for line in sys.stdin})
Run Code Online (Sandbox Code Playgroud)

如果你想在新行中打印每一行,就像你在你的例子中所做的那样,你可以将已排序的数字转换成字符串,使用mapstr函数,就像这样

map(str, sorted({int(line) for line in sys.stdin}))
Run Code Online (Sandbox Code Playgroud)

然后你可以将它们连接起来\n并打印出来,就像这样

print "\n".join(map(str, sorted({int(line) for line in sys.stdin})))
Run Code Online (Sandbox Code Playgroud)

你去!您的整个计划都在一条线上.:) :)