【问题标题】:Python behaves weird with piped inputPython 对管道输入的行为很奇怪
【发布时间】:2017-10-20 01:34:57
【问题描述】:

由于我的代码中有一些奇怪的行为,我无法从 python 程序中的 .txt 文件读取输入。我正在像这样运行我的 python 脚本:

python3 file.py < input.txt

我的 python 文件(file.py)如下所示:

inDATA = ''

for i in range(7):
    tmp = str(input())
    print(tmp)
    inDATA = "X" + inDATA + tmp
    print(inDATA)

print(inDATA)

我的输入文件(input.txt)如下:

1
2
3
4
5
6
7

当我运行我的 python 并从控制台输入输入 (1\n2\n3...) 时,我得到了预期的输出:

1
X1
2
XX12
3
XXX123
4
XXXX1234
5
XXXXX12345
6
XXXXXX123456
7
XXXXXXX1234567
XXXXXXX1234567

但是,当我运行 python3 file.py &lt; input.txt 时,我得到了

1
X1
2
2X1
3
3XX1
4
4XXX1
5
5XXXX1
6
6XXXXX1
7
7XXXXXX1
7XXXXXX1

有人知道导致这种行为的原因吗?

我也尝试在 python2 中使用 python file.py &lt; input.txt 运行它(并将 input() 更改为 raw_input()),但没有效果。

编辑: 这个问题不是“如何从 linux 程序逐行通过管道将输入输入到 python?”的重复,该问题询问了 如何 管道,另一方面,这个问题是关于为什么当从文件管道时代码表现得很奇怪

【问题讨论】:

  • @OTTTO 我不这么认为,但是,我会看看它以确保 :) thx
  • 如果您记录repr(tmp),差异(输入之间的差异——即您的文件包含不同数据的确切方式与您在键盘上输入的内容)将很明显。
  • @CharlesDuffy 好的,我去看看,谢谢!
  • @CharlesDuffy 谢谢!我的问题是我的文件在每一行的末尾都有一个 \r,所以我做了一些快速的谷歌搜索,发现我必须使用 .rstrip() 来删除它:)

标签: python python-3.5


【解决方案1】:

这是一个回车换行的事情,但是您没有提供足够的线索来确定确切的问题。

在打印语句中使用它们之前,将以下内容添加到字符串的末尾进行实验。 +'\r' +'\n'

阅读https://blog.codinghorror.com/the-great-newline-schism/ 后,使用十六进制编辑器检查您的文件。

检查您的控制台,也就是终端窗口,也就是命令行,是如何配置来处理这些控制字符的。您是否使用默认设置?

您必须始终按照操作系统的约定使用这些控制字符。

如果您在例如 Microsoft 操作系统上使用 telnet 或 ssh 在例如 Unix 计算机上运行代码,事情会变得更加复杂。

【讨论】:

  • 谢谢,这是回车问题。
猜你喜欢
  • 1970-01-01
  • 2011-08-26
  • 2019-12-19
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多