【问题标题】:Why won't it write to the file?为什么它不会写入文件?
【发布时间】:2012-03-12 12:36:01
【问题描述】:

所以我有代码:

def logdata(x, y):
    try:
        f = open('multlog.txt', 'a')
        f.write("{0:g} * {1:g} = {2:g}\n".format(x,y, (x*y)))
    except ValueError:
        f.write("Error, you tried to multiply by something that wasn't a number")
        raise
    finally:
        f.close()
print("This is a test program, it logs data in a text file, 'multlog.txt'")
fn = input("Enter the first number you'd like to multiply by: ")
sn = input("Enter the second number you'd like to multiply by: ")
logdata(int(fn), int(sn))

我想要它做的是,当它到达一个值错误时,它会写入文件,“错误,你试图乘以一个不是数字的东西”。但是,如果用户输入一个字母,比如“j”,ValueError: invalid literal for int() with base 10: 'j',文件达到值错误,它就不会写入文件!

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    至少有两个问题:

    1. 文件未打开以在except 块中写入(或追加)。
    2. 正如@DSM 在评论中指出的那样,当您调用int() 时会引发 ValueError

    我会改写成下面的例子。
    如果您使用with 语句,那么您可以不使用finally 块。

    def logdata(x, y):
        with open('multlog.txt', 'a') as f:
            try:
                x = int(x); y = int(y)
                f.write("{0:g} * {1:g} = {2:g}\n".format(x,y, (x*y)))
            except ValueError:
                f.write("Error")
    
    print("This is a test program, it logs data in a text file, 'multlog.txt'")
    fn = input("Enter the first number you'd like to multiply by: ")
    sn = input("Enter the second number you'd like to multiply by: ")
    logdata(fn, sn)
    

    【讨论】:

    • 即使我把 f = open('multlog.txt', 'a') 放在 except 块中仍然不这样做......
    • 我认为错误在别处:ValueError 是在 int() 调用中引发的,而不是在函数内部,所以它没有被捕获。
    • 谢谢,@DSM。刚刚也注意到了。相应地编辑了答案。
    • 非常感谢,因为我是初学者,我真的不知道 as 和 with 语句是什么意思。你能解释一下吗?
    • @user1247509:当然。 with 语句确保文件在with 块的末尾关闭;即使发生异常。基本上你会免费获得一个 try/finally 块。如果您有兴趣,请在此处了解更多详细信息:python.org/dev/peps/pep-0343
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多