【问题标题】:Why isn't < working to read in a file from the command line (simple Python code)?为什么 < 不能从命令行读取文件(简单的 Python 代码)?
【发布时间】:2014-03-08 16:53:26
【问题描述】:

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

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”时它工作得很好,但是当我尝试像“python pysortints.py

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

【问题讨论】:

  • 尝试打印 sys.argv ... 或尝试打印 sys.stdin.read() ... 我认为将其作为标准输入发送
  • 这根本不是关于 Python 的问题,而是关于命令行和可执行文件之间的交互实际如何工作的问题。

标签: python file input command-line


【解决方案1】:

当你这样做时

pysortints.py < testfile

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

因此,您需要使用raw_input(如果您使用的是 Python 2.x)或input(如果您使用的是 Python 3.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})

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

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

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

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

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

【讨论】:

  • 非常感谢!我想我只是在命令行输入和文件输入之间混淆了。如果可以的话,我会给你额外的加分来缩短我的代码!
  • @Worcestershire 谢谢 :) 享受 Python :)
  • {int(line) for line in sys.stdin} 应该给出错误,因为line 是包含所有数字的整行,例如 '1 3 2 4 6\n'。所以,int('1 3 2 4 6\n') 对我不起作用。您需要拆分线路。
  • 我同意“是纯数字的行”令人困惑且不清楚,因为它可能暗示每一行只有数字。
  • @thefourtheye 我可以同意。另外,您的帖子很有教育意义。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    除了 thefourtheye 的建议之外,您可以在不修改的情况下运行您的脚本。为此,您需要将文件的内容作为参数传递(而不是使用 'xargs 命令的帮助下做到这一点:

    cat testfile | xargs python pysortints.py
    

    如果你还想使用&lt;重定向那么注意拆分从文件中读取的行:

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

    【讨论】:

      猜你喜欢
      • 2020-06-04
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多