【问题标题】:python stdin with txt file and input() functionpython stdin 与 txt 文件和 input() 函数
【发布时间】:2017-08-28 03:18:26
【问题描述】:

我有一个包含以下内容的 input.txt 文件。

3 
4 5

我想通过在命令行中使用以下命令将其用作标准输入。

python a.py < input.txt

在 a.py 脚本中,我尝试使用 input() 函数逐行读取输入。我知道有更好的方法来读取标准输入,但我需要使用 input() 函数。

一种天真的方法

line1 = input()
line2 = input()

没用。我收到以下错误消息。

File "<string>", line 1
  4 5
    ^
SyntaxError: unexpected EOF while parsing

【问题讨论】:

    标签: python input stdin


    【解决方案1】:

    这样没问题,行得通:

    read = input()
    print(read)
    

    但你只是在读一行。

    来自input() 文档:

    函数然后从输入中读取一行,将其转换为字符串 (去除尾随的换行符),然后返回。

    这意味着如果文件不以空行结尾,或者相同,文件的最后一个非空行不以end of line 字符结尾,您将得到exceptions.SyntaxError 和最后一行不会被读取。

    【讨论】:

    • 我添加了更多细节。当我尝试读取第二行时出现错误。
    • @hwchung 我编辑了我的答案。为什么你必须坚持使用input() func 有什么特别的原因吗?正如我所看到的情况,或者您在文件末尾添加一个结束行,或者您将不得不使用除input() 之外的另一种方式来读取您作为脚本的标准输入传递的文件内容。存在其他几个选项,如果您对它们感兴趣,请告诉我;)
    • 感谢您的回答。我想坚持使用 input() 函数,因为我想做的是调试我在 HackerRank 网站中使用的代码。在那里我使用 input() 函数来获取输入。使用我的本地机器进行调试要容易得多。所以我正在尝试编写一个在本地获取输入的代码。在我的文件末尾添加结束行是什么意思?
    • @hwchung 迭代 sys.stdin 更加通用。
    • @hwchung 正如 Nick T 所说,sys.stdin 是一个不错的选择。您可以像对待任何普通文件一样对待它,并执行for line in sys.stdin:sys.stdin.readlines() 等操作。
    【解决方案2】:

    你提到了 HackerRank;查看我的一些旧提交,我想我选择放弃 input 代替 sys.stdin 操作。 input()next(sys.stdin) 非常相似,但后者可以很好地处理 EOF。

    例如,我对https://www.hackerrank.com/challenges/maximize-it/的回答

    import sys
    import itertools
    
    # next(sys.stdin) is functionally identical to input() here
    nK, M = (int(n) for n in next(sys.stdin).split())
    
    # but I can also iterate over it
    K = [[int(n) for n in line.split()][1:] for line in sys.stdin]
    
    print(max(sum(x**2 for x in combo) % M for combo in itertools.product(*K)))
    

    【讨论】:

      猜你喜欢
      • 2016-01-31
      • 2021-05-14
      • 2015-01-21
      • 1970-01-01
      • 2022-01-05
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      相关资源
      最近更新 更多