吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 318|回复: 5
收起左侧

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

[复制链接]
夜雨微澜 发表于 2024-3-17 12:36
本帖最后由 夜雨微澜 于 2024-3-17 13:00 编辑

[Python] 纯文本查看 复制代码
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: [Errno 2] 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 行

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
夜雨微澜 + 1 + 1 谢谢@Thanks!

查看全部评分

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

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

下面是修改后的代码:

[Python] 纯文本查看 复制代码
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)。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
夜雨微澜 + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| 夜雨微澜 发表于 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'

文件不存在....
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-30 20:11

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表