尝试在Python sh中使用输入/输出重定向时出现错误“无效语法”

2024-10-04 05:31:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在pythonshell中练习输入/输出重定向。我有一个文件名为SentinelValue.py这就是我在另一个文件中添加数字的代码:

data = eval(input("Enter an integer (the input ends " + "if it is 0): "))

sum = 0
while data != 0:
    sum += data

    data = eval(input("Enter an integer (the input ends " + "if it is 0): "))

print("The sum is", sum)

“另一个文件”数字.txt“包含数字:

1 
2 
3 
4 
5 
6 
7 
8 
9 
0

还有我的输出.txt文件是我想显示总和的地方。你知道吗

我试过使用:

python SentinelValue.py < Numbers.txt > output.txt

但在shell中,它突出显示了“SentinelValue”,并表示“无效语法”。 我不知道为什么不行。你知道吗


Tags: 文件thepytxtaninputdatais
1条回答
网友
1楼 · 发布于 2024-10-04 05:31:55

您的代码有几处错误:

  • 正如评论中已经建议的那样,不要使用eval()进行直接的用户输入(或者几乎任何时候,在99%的情况下,当你认为你需要它的时候-你不需要!)。一个简单的int()转换应该足够了,而不会有eval()的所有危险。你知道吗
  • 与上一个连接,eval()计算输入。此外,在python2.x上,input()本身进行求值(它相当于eval(raw_input())),因此每当遇到无效输入时,就会弹出一个SyntaxError。你知道吗
  • 即使它没有弹出一个SyntaxError,它也肯定会弹出一个TypeError,因为eval()需要一个字符串,它会从内部input()接收一个整数。你知道吗
  • 您正在向STDOUT打印“enterainteger…”提示,这将导致它在output.txt中结束(在这里您重定向STDOUT)。你知道吗
  • 您将内置的sum()用作一个变量来隐藏它。这是一个糟糕的做法,可能会导致许多问题和意想不到的结果下线。你知道吗

所以,记住这些,下面是如何重写它来解决这些问题:

# Let's first make sure it works on Python 2.x and 3.x by shadowing the input
try:
    input = raw_input  # on Python 2.x use raw_input instead of input
except NameError:
    pass

result = 0  # tip: use a name that's not already built-in, like result
while True:  # loop 'forever'...
    data = input()  # don't print anything when asking for input
    try:
        data = int(data)  # don't print anything to STDOUT
        if not data:  # only if the integer is 0
            break
        result += data  # add to the final result
    except ValueError:  # risen if the input is not an integer...
        pass  # so just ignore it

print("The sum is: " + str(result))  # finally, print the result

相关问题 更多 >