马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
×
本帖最后由 15271953841 于 2024-3-13 08:12 编辑
Python 3.12.1 (tags/v3.12.1:2305ca5, Dec 7 2023, 22:03:25) [MSC v.1937 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
一、with语句和上下文管理器
open("FishC.txt","w")
<_io.TextIOWrapper name='FishC.txt' mode='w' encoding='cp936'>
f=open("FishC.txt","w") (FishC.txt里面如果有内容,用“w”形式打开,因为它有一个截断功能,所以FishC.txt中的内容会被截断,就没有了,相当于被清空,重新写入的意思。 Open打开后,返回一个文件对象,给到f变量)
f.write("I love little sister.")
21
f.close() (关闭后,才可保存到硬盘,打开——操作——关闭,才能保存所编写的内容到硬盘)
with open("FishC.txt","w") as f:
f.write("I love Python.")
14 (文件正常关闭,with关闭的)
在编辑模式下写入
f=open("FishC.txt","w")
f.write("I love little sister.")
1/0 (故意加入1除以0)
f.close()
保存为test.py,默认保存到Python的安装目录下面C:/Users/Administrator/AppData/Local/Programs/Python/Python312
让程序执行起来,Run module
在互动模式下查看,报错,
= RESTART: C:/Users/Administrator/AppData/Local/Programs/Python/Python312/test.py
Traceback (most recent call last):
File "C:/Users/Administrator/AppData/Local/Programs/Python/Python312/test.py", line 3, in <module>
1/0
ZeroDivisionError: division by zero
报错原因:除数不能为0,但相应的也创建了一个FishC.txt文件在Python的安装目录下,可是打开FishC.txt文件,文件中没有写入字符串。因为程序没有机会执行到close文件关闭的操作,所以写入的内容就在文件对象的缓冲区里面,并没有写入硬盘里面,程序就关闭了。
在编辑模式下,这样改,另存为test2.py,让程序执行起来,Run module,在互动模式下查看,仍然报错,
= RESTART: C:/Users/Administrator/AppData/Local/Programs/Python/Python312/test2.py
Traceback (most recent call last):
File "C:/Users/Administrator/AppData/Local/Programs/Python/Python312/test2.py", line 3, in <module>
1/0
ZeroDivisionError: division by zero
报错原因:除数不能为0,但此时打开创建的FishC.txt文件,里面被写入了内容,尽管运行中出错,但是with上下文管理器依然帮你确保这个文件能正常地关闭。
二、pickle 泡菜——Python序列化的第一人
Pickle模块解决的就是一个永久存储Python对象的问题,它允许你将字符串、列表、字典,这些Python对象保存为文件的形式。
将Python对象序列化这么一个操作,变成0101010101……二进制组合。
所谓序列化,就是将Python对象转化成二进制字节流的过程。
编辑模式下,打开write.py文件,里面事先写好四种Python的对象,也可临时编辑,保存为write.py文件。
x,y,z=1,2,3 (整数变量)
s="FishC" (字符串)
l=["小姐姐",520,13.14] (列表)
d={"one":1,"two":2,"three":3} (字典)(都是Python的对象)
再次编辑成下面的样子:
import pickle
x,y,z=1,2,3
s="FishC"
l=["小姐姐",520,13.14]
d={"one":1,"two":2,"three":3}
with open("data.pkl","wb") as f: (保存为pickle文件,后缀是.pkl,“wb”以二进制可见的形式打开)
pickle.dump(x,f)
pickle.dump(y,f)
pickle.dump(z,f)
pickle.dump(s,f)
pickle.dump(l,f)
pickle.dump(d,f)
保存,Run Module运行,互动模式下没有什么变化:
= RESTART: C:/Users/Administrator/AppData/Local/Programs/Python/Python312/write.py
但是在当前文件目录下,就多出来一个文件data.pkl文件,双击打开(我这没有打开,因为不知道用什么程序打开),里面是一些0,1组成的二进制数据。如果使用记事本打开的话,它显示的是一些乱码。
下面,在前面write.py的基础上,另存为read.py,看看经过重新编辑能不能把这些乱码文件通过记事本读出来,编辑如下:
import pickle
with open("data.pkl","rb") as f: (“wb”改成“rb”,我们是读取一个二进制文件)
x=pickle.load(f) (pickle.load()后面传入一个文件f,然后读取到x.
y=pickle.load(f) (什么顺序存进去的,就以什么顺序读回来)
z=pickle.load(f)
s=pickle.load(f)
l=pickle.load(f)
d=pickle.load(f)
print(x,y,z,s,l,d,sep="\n") (设置分隔符,每打印一次换一行)
编辑好后,保存,运行一下
在互动模式下查看
= RESTART: C:/Users/Administrator/AppData/Local/Programs/Python/Python312/read.py
1
2
3
FishC
['小姐姐', 520, 13.14]
{'one': 1, 'two': 2, 'three': 3}
上面的write.py和read.py也可以写成元组的形式:
把write.py编辑成:
import pickle
x,y,z=1,2,3
s="FishC"
l=["小姐姐",520,13.14]
d={"one":1,"two":2,"three":3}
with open("data.pkl","wb") as f:
pickle.dump((x,y,z,s,l,d),f) (原来的6行可以写成元组的形式)
把read.py编辑成:
import pickle
with open("data.pkl","rb") as f:
x,y,z,s,l,d=pickle.load(f) (相当于进行一个解包)
print(x,y,z,s,l,d,sep="\n")
|