【问题标题】:Python prints error message io.UnsupportedOperation: not readablePython 打印错误消息 io.UnsupportedOperation: not readable
【发布时间】:2015-06-14 06:04:09
【问题描述】:

我在这个网站上搜索过类似的问题,但没有找到任何有效的解决方案,因此,这个问题。 我正在编写一个 Python 3.4 程序,其中有一个函数 export,它基本上将数据附加到文本文件中。 该函数检查以确保存在适当的文件,如果没有,则创建一个,然后获取文件的内容,添加附录并覆盖文件。 Python 在for line in file: 处抛出错误另外,再次运行该程序时,一旦创建了文本文件,就不会发生此错误。 这是函数:

def export(addendum, user):
    filename = user + '.txt'
    try:
        file = open(filename, 'r')
    except OSError:
        file = open(filename, 'w')
        export(addendum, user)
    file_contents = ''
    print('What day is it? (1-5)')
    day = input()
    day = int(day)
    if day >= 1 and day <= 5:
        for line in file:
            file_contents += line
        file = open(filename, 'w')
        new_file = file_contents + '\n' + addendum
        file.write(new_file)
        file.close()
    else:
        print('Invalid weekday number...')
        sys.exit()

【问题讨论】:

    标签: python macos python-3.x file io


    【解决方案1】:

    当文件尚不存在时会发生这种情况,因为那是文件以写入模式打开的时候。写模式不可读。

    我对这里发生的事情的理解是,当文件在第一次调用时不存在时,您的 except 块会打开一个文件并将一个文件放在那里;然后由于某种原因递归,它会在此调用中命中第一个块,并在堆栈的该级别完成;当它返回到下一个级别时,您的第一次调用将继续,但文件引用仍处于写入模式,无论堆栈的其他级别已完成。当它到达for line in file 时,它会爆炸。

    我建议您大大简化您在这里所做的事情。

    def export(addendum, user):
        filename = user + '.txt'
        try:
            with open(filename, 'r') as file:
                contents = file.read()
        except OSError:
            contents = ""
        day = input("What day is it (1-5)?")
        day = int(day)
        if not (1 <= day <= 5):
            print("Invalid weekday number...")
            sys.exit()
        contents += '\n' + addendum
        with open(filename, 'w') as file:
            file.write(contents)
    

    【讨论】:

    • 我明白了。非常感谢您的帮助。我只是使用循环来避免遇到内存限制,尽管据我了解,在现代系统上的 python 3 中这并不是一个真正的问题。另外,我需要查看 with 关键字。现在看,我不太确定为什么要使用递归。再次感谢您,过去一个小时我一直在尝试调试它。
    猜你喜欢
    • 2017-12-07
    • 1970-01-01
    • 2016-05-11
    • 2018-04-17
    • 1970-01-01
    • 2014-09-13
    • 2018-02-17
    • 2016-08-07
    相关资源
    最近更新 更多