夜雨微澜 发表于 2024-3-17 12:36

try……except结构求助(已解决)

本帖最后由 夜雨微澜 于 2024-3-17 13:00 编辑

import pickle
historylst=[]
error=[]
try:
    data=open('data.pickle','r+b')
except:
    data=open('data.pickle','w+b')
    print('data.pickle is not exist')
    pickle.dump((historylst,error),data)
    data.flush()
print(pickle.load(data))
else:
    print('data.pickle is exist')
开发一个带有自动保存功能的软件,遇到了问题,上面是保存功能得代码。
具体逻辑是,先检测文件是否存在,如果存在,就以读取方式打开,并输出存在;如果不存在,就新建一个,并输出不存在,然后加载内容并输出。。
由于r方式打开文件,不存在会报错,所以我用try结构判断是否存在。
但是,执行代码的时候,当执行到try下面那行的时候,如果此时文件不存在,就会报错。按理说,try管辖的部分,即使有错也不应该报错的,但是却报错了。
请各位大神不吝赐教,谢谢
报错信息如下:
data.pickle is not exist
Traceback (most recent call last):
File "test.py", line 5, in <module>
    data=open('data.pickle','r+b')
FileNotFoundError: No such file or directory: 'data.pickle'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "test.py", line 11, in <module>
    print(pickle.load(data))
EOFError: Ran out of input
请按任意键继续. . .

Vvvvvoid 发表于 2024-3-17 12:40

File "test.py", line 11, in <module>


你报错的是第 11 行, except 只捕获到了第 10 行

Henglie 发表于 2024-3-17 12:43

你的代码逻辑基本上是正确的,但是有几个细节需要调整以避免出现这些错误。首先,关于文件不存在时尝试用 'r+b' 模式打开会引发 FileNotFoundError,这部分你已经正确地用 try-except 块来处理了。然而,当你在 except 块中创建文件并使用 pickle.dump 写入后,你需要重新定位文件指针到文件的开始,才能读取刚才写入的内容。这是因为写入操作后,文件指针位于文件的末尾。

此外,else 语句的使用在这里是多余的,因为你想要的逻辑是:如果文件不存在就创建它并初始化,如果存在就直接读取,不需要一个额外的 else 来处理文件存在的情况。

下面是修改后的代码:

import pickle

historylst = []
error = []

try:
    # 尝试以读写二进制模式打开文件,这样即可读取也可写入
    data = open('data.pickle', 'r+b')
except FileNotFoundError:
    # 如果文件不存在,则创建一个新文件,并初始化数据
    print('data.pickle does not exist, creating a new one.')
    data = open('data.pickle', 'w+b')
    pickle.dump((historylst, error), data)
    # 重置文件指针到文件的开始,以便读取
    data.seek(0)
else:
    print('data.pickle exists.')

# 读取文件内容
try:
    print(pickle.load(data))
finally:
    data.close()

这里做了几个关键的调整:

    在 except 块中,创建文件并写入初始化数据后,通过 data.seek(0) 将文件指针移动到文件开始的位置,以便接下来能读取内容。
    移除了 else,因为它在这里不是必需的。
    添加了一个 finally 块来确保文件在最后被关闭,这是一个好习惯,可以避免文件资源泄露。

请注意,上述代码在文件已经存在且含有数据的情况下可以正常工作。但如果文件是空的,pickle.load(data) 仍然会引发 EOFError,因为它试图从一个空文件中读取数据。在实际应用中,你可能需要根据文件是否已经包含数据来决定是否执行 pickle.load(data)。

夜雨微澜 发表于 2024-3-17 12:43

Vvvvvoid 发表于 2024-3-17 12:40
File "test.py", line 11, in




感谢解答
我能否再请教一下,第五行有错是什么原因呢,谢谢
File "test.py", line 5, in <module>
    data=open('data.pickle','r+b')

Arcticlyc 发表于 2024-3-17 12:49

During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "test.py", line 11, in <module>
    print(pickle.load(data))
EOFError: Ran out of input

Vvvvvoid 发表于 2024-3-17 13:36

夜雨微澜 发表于 2024-3-17 12:43
感谢解答
我能否再请教一下,第五行有错是什么原因呢,谢谢
File "test.py", line 5, in


No such file or directory: 'data.pickle'

文件不存在....
页: [1]
查看完整版本: try……except结构求助(已解决)