ValueError: invalid literal for int() : while using python stream redirection
ValueError: invalid literal for int() : while using python stream redirection
我在 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()
时,它 returns 文件的当前行(stdin 也被视为文件)或 returns 到达换行符 EOF。 (doc)
你的 writer.py returns 只有 4 个元素,但是你的 adder.py 在无限循环中读取输入,所以当它读取了 4 个数字时,stdin 为空并且 readline()
returns换行符,不能将空白字符转换为int
。事实上,您使用的是 readline()[:-1]
所以在您的情况下您得到的只是一个空字符串。
另一方面,你的打印在无限循环之后,所以它永远不会被调用(即使你用 KeybordInterrupt 停止它)。我建议使用类似的东西:
line = sys.stdin.readline()[:-1]
while line:
#do stuff
line = sys.stdin.readline()[:-1]
我在 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()
时,它 returns 文件的当前行(stdin 也被视为文件)或 returns 到达换行符 EOF。 (doc)
你的 writer.py returns 只有 4 个元素,但是你的 adder.py 在无限循环中读取输入,所以当它读取了 4 个数字时,stdin 为空并且 readline()
returns换行符,不能将空白字符转换为int
。事实上,您使用的是 readline()[:-1]
所以在您的情况下您得到的只是一个空字符串。
另一方面,你的打印在无限循环之后,所以它永远不会被调用(即使你用 KeybordInterrupt 停止它)。我建议使用类似的东西:
line = sys.stdin.readline()[:-1]
while line:
#do stuff
line = sys.stdin.readline()[:-1]