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

2024-05-26 22:58:50 发布

您现在位置: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

当我键入“pythonpysortints.py公司1 5 6 7 2 6 7 254 2 543“,但是当我尝试类似“pythonpysortints.py公司<;testfile“(当testfile是纯数字行时),除了一些print语句(“sorted”)外,什么都不会出现。你知道吗

有什么想法吗?为了以防万一,我试过rstrip在x上,但似乎什么都没用。你知道吗


Tags: inpy程序forsys公司数字arguments
3条回答

或者,除了fourtheye所建议的,您可以运行脚本而无需修改。为此,需要将文件的内容作为参数传递(而不是使用“<;”作为标准输入)。您可以借助xargs命令:

cat testfile | xargs python pysortints.py

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

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

您需要阅读STDIN,而不是参数

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

当你这么做的时候

pysortints.py < testfile

testfile的内容在标准输入中可用,而不是作为命令行参数。你知道吗

因此,您需要使用raw_input(如果您使用的是python2.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})))

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

相关问题 更多 >

    热门问题