Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ValueError:int()的文本无效:使用python流重定向时_Python_Stdin_Eoferror - Fatal编程技术网

ValueError:int()的文本无效:使用python流重定向时

ValueError:int()的文本无效:使用python流重定向时,python,stdin,eoferror,Python,Stdin,Eoferror,我在Python中使用标准流重定向。我有一个writer.py文件,如下所示 for data in (123, 0, 999, 42): print('%03d' % data) 它的输出被用作加法程序的输入 import sys sum = 0 while True: try: line = sys.stdin.readline()[:-1] except EOFError: break else: sum += int(li

我在Python中使用标准流重定向。我有一个writer.py文件,如下所示

for data in (123, 0, 999, 42):
    print('%03d' % data)
它的输出被用作加法程序的输入

import sys 
sum = 0 
while True:
    try:
      line = sys.stdin.readline()[:-1]
    except EOFError: break
    else:
        sum += int(line)
print(sum)
将第一个脚本的输出作为以下内容提供给其他脚本:

python writer.py | python adder.py
这给了我一个错误:

 File "adder.py", line 9, in <module>
    sum += int(line)
ValueError: invalid literal for int() with base 10: ''
需要在adder.py脚本中更改的内容。

您的adder.py文件应如下所示:

import sys
sum = 0
while True:
    line = sys.stdin.readline()[:-1]
    if line:
        sum += int(line)
    else:
        break

print(sum)
我希望它能解决您的问题。

当您调用readline时,它会返回文件的当前行stdin也被视为文件,或者在EOF到达时返回换行符

writer.py只返回4个元素,但是adder.py以无限循环的方式读取输入,因此当它读取了4个数字时,stdin为空,readline返回一个换行符,并且您无法将空白字符转换为int。事实上,您使用的是readline[:-1],因此在本例中,您只得到一个空字符串

另一方面,您的打印在无限循环之后,因此即使您使用KeybordInterrupt停止打印,也不会调用它。我建议使用以下方法:

line = sys.stdin.readline()[:-1]
while line:
    #do stuff
    line = sys.stdin.readline()[:-1]

很可能是因为你想把一个线终结者投射到int.@BoboDarph,是的,我也这么想。但是shud'Exception EOFError:break'不能处理这个问题吗?EOF发生在之后的下一次读取中。当我使用它时,它跳过第一个元素,并给出其余三个元素的总和。@Sarang你应该把代码的其余部分放在do的位置。第二条读线必须位于循环的末尾。你可以用休息代替,就像rishi kant在他的解决方案中所做的那样。