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



我有一个简单的程序,可以读取数字并按顺序返回:

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

当我键入"python-pysortints.py 1 5 6 7 2 6 7 254 2 543"时,它非常有效,但当我尝试类似"pythont-pysortins.py<testfile"(当testfile是纯数字行时)的东西时,除了一些打印语句("sorted")外,什么都不会出现。

有什么想法吗?我试着在x上rstrip以防万一,但它似乎没有任何作用。

进行时

pysortints.py < testfile

testfile的内容在标准输入中变得可用而不是作为命令行参数。

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

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

import sys
for x in sys.stdin:
myset.add(int(x))

注意:您不需要剥离传递给int函数的字符串数据。它将忽略开头和结尾的空白字符,对您来说:)

让我们稍微改进一下代码。你的意图是只找到独特的元素并对它们进行排序。因此,你可以使用集合理解,而不是向集合中添加元素,比如这个

{int(line) for line in sys.stdin}

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

print sorted({int(line) for line in sys.stdin})

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

map(str, sorted({int(line) for line in sys.stdin}))

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

print "n".join(map(str, sorted({int(line) for line in sys.stdin})))

给你!您的整个程序在一行中。:):)

您需要读取STDIN,而不是参数:

import sys
for line in sys.stdin:
print line.rstrip()

除了的建议,还建议您可以在不修改的情况下运行脚本。为此,您需要将文件的内容作为参数传递(而不是使用"<"作为标准输入)。您可以在xargs命令的帮助下完成此操作:

cat testfile | xargs python pysortints.py

如果您仍然想使用<重定向,请注意拆分从文件中读取的行:

myset = set()
for line in sys.stdin:
for x in line.split():
myset.add(int(x))

最新更新