文件和异常
数据持久化,即对需要使用到的数据进行永久的存储,常用的有数据库,文件等方式。而文件是最为简单的一种方式。
而在Python中进行文件的读写较为简单。通过Python内置函数open。
| 操作模式 | 具体含义 |
|---|---|
'r' | 读取 (默认) |
'w' | 写入(会先截断之前的内容) |
'x' | 写入,如果文件已经存在会产生异常 |
'a' | 追加,将内容写入到已有文件的末尾 |
'b' | 二进制模式 |
't' | 文本模式(默认) |
'+' | 更新(既可以读又可以写) |
读写文本文件
eg
f = open('xxx.txt','r',encoding ='utf-8')
print(f.read())
f.close()
但我们要思考的一个问题是,假如在对应的位置没有发现该文件那么计算机会怎么处理该段程序那?
毫无疑问会引发异常导致崩溃。那么为了防止这种现象发生我们就要引入异常的概念。
eg
f=None
try:
f=open('xxx.txt','r',encoding='utf-8')
print(f.read())
except FileExistsError:
print("无法打开指定的文件")
except LookupError:
print("指定了未知的编码")
except UnicodeDecodeError:
print('读取文件时解码错误')
finally:
if f:
f.close()
在Python中,我们可以将那些在运行时可能会出现状况的代码放在try代码块中,在try代码块的后面可以跟上一个或多个except来捕获可能出现的异常状况。例如在上面读取文件的过程中,文件找不到会引发FileNotFoundError,指定了未知的编码会引发LookupError,而如果读取文件时无法按指定方式解码会引发UnicodeDecodeError,我们在try后面跟上了三个except分别处理这三种不同的异常状况。最后我们使用finally代码块来关闭打开的文件,释放掉程序中获取的外部资源,由于finally块的代码不论程序正常还是异常都会执行到。
那么除了这种方法以外,我们还可以将读取的文件的内容按照行来进行读取,最后输出。
#一次读取整个文件的内容
with open('xxx.txt','r',encoding='utf-8') as f:
print(f.read())
#通过for-in循环进行读取
with open('xxx.txt',mode='r') as f:
for line in f:
print(line,end=' ')
time.sleep(0.5)
那么,如何写那?
基本格式和读一致,但不再是‘r’,而变成‘w’了。注意如果需要对文件内容进行追加式写入,应该将模式设置为'a'。如果要写入的文件不存在会自动创建文件而不是引发异常。在这里不再举例。同样对于图片我们可以把图片当作一个二进制文件,使用二进制的方式进行读写,这样就形成了图片的复制。
读写JSON文件
json的具体概念不在说明。其大致如同python中字典的样式以key:value的形式存储。但又略有不同。
其具体数据类型对照如下:
| JSON | Python |
|---|---|
| object | dict |
| array | list |
| string | str |
| number (int / real) | int / float |
| true / false | True / False |
| null | None |
eg
mydict = {
'name': 'Aug',
'age': 22,
'qq': 1341735085,
'friends': ['王大锤', '白元芳'],
'cars': [
{'brand': 'BYD', 'max_speed': 180},
{'brand': 'Audi', 'max_speed': 280},
{'brand': 'Benz', 'max_speed': 320}
]
}
try:
with open('data.json','w',encoding='utf-8') as f:
json.dump(mydict,f)
except IOError as e:
print(e)
print('保存数据完成')
json模块主要有四个比较重要的函数,分别是:
dump- 将Python对象按照JSON格式序列化到文件中dumps- 将Python对象处理成JSON格式的字符串load- 将文件中的JSON数据反序列化成对象loads- 将字符串的内容反序列化成Python对象
这里出现了两个概念,一个叫序列化,一个叫反序列化。自由的百科全书维基百科上对这两个概念是这样解释的:“序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换为可以存储或传输的形式,这样在需要的时候能够恢复到原先的状态,而且通过序列化的数据重新获取字节时,可以利用这些字节来产生原始对象的副本(拷贝)。与这个过程相反的动作,即从一系列字节中提取数据结构的操作,就是反序列化(deserialization)”。

449

被折叠的 条评论
为什么被折叠?



