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,但它似乎没有做任何事情.
当你这样做
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)
如果你想在新行中打印每一行,就像你在你的例子中所做的那样,你可以将已排序的数字转换成字符串,使用map
和str
函数,就像这样
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)
你去!您的整个计划都在一条线上.:) :)