(十二)文件和异常
1. 从文件中读取数据
1.1 读取整个文件内容
with 方法:
with open('test.txt') as file_project:
contents = file_project.read()
print(contents)
open-close 方法:
fo = open('test.txt')
contents = fo.read()
print(contents)
fo.close() # 注意关闭文件
说明:
with使得我们不需要手动关闭文件;打开文件就必须要关闭文件,否则文件会出现数据丢失等问题;open()函数打开一个文件,参数是文件名,必要时带上相对路径;file_project是构造的一个文件对象,在with块内对其进行操作;read()方法读取整个文件,返回一个字符串;
1.2 逐行读取(一)
filename = 'test.txt'
with open(filenname) as file_project:
for line in file_project:
print(line.rstrip())
1.3 逐行读取(二)
filename = 'test.txt'
with open(filenname) as file_project:
lines = file_project.readlines()
for line in lines:
print(line.rstrip())
说明:
readlines()读取文件内容的每一行,包括换行\n,返回一个列表;readline([size])按照读取次数从上到下依次读取一行;rstrip()是为了消除换行\n;
1.4 处理读取的文件内容
filename = 'test.txt'
with open(filename) as file_project:
lines = file_project.readlines()
string = ''
for line in lines:
string += line.rstrip()
2. 写入文件
2.1 覆盖重写
with open('1.txt', 'w') as file_project:
file_project.write('I like Python.')
以 w (只读)方式对文件写入,会覆盖原始数据。
2.2 附加写入
with open('1.txt', 'a') as file_project:
file_project.write('I like Python.')
以 a (附加)形式写入,会在原文件内容后面新增一条数据。
2.3 清空文件内容
with open('1.txt', 'w') as file_project:
file_project.truncate()
以 w (写入)形式使用 truncate 方法清空文件数据。
3. 文件读写总结
格式一:
fo = open(filename, mode, buffering=-1, encoding=None)
# 文件操作
fo.close()
格式二:
with open(filename, mode, buffering=-1, encoding=None) as file_project:
# 文件操作
参数说明:
filename: 文件名mode: 打开文件的模式buffering: 是否缓冲;0=不缓冲,1=缓冲, >1的int数=缓冲区大小encoding: 文件编码,一般是utf-8
mode 参数:
| 模式 | 说明 |
|---|---|
r |
只读 模式;若文件不存在则报错;默认模式。 |
rb |
二进制格式只读;但文件属于非文本,默认模式。 |
r+ |
读写 模式。文件指针将会放在文件的开头。 |
rb+ |
二进制格式 读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w |
只写 模式;如果该文件已存在则打开文件,并从开头编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb |
二进制格式 只写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ |
读写 模式。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ |
以二进制格式打开一个文件用于 读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a |
追加 模式;如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab |
二进制格式 追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ |
读写 模式。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写 |
ab+ |
二进制格式 追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
+ |
更新 模式,可读可写。 |
x |
只写 模式,新建一个文件,如果该文件已存在则会报错 |
4. 异常
4.1 try-except
4.2 try-except-else
- 将要验证是否出错的代码段放在
try块中,将通过try块后要执行的代码放在else中;excpet中的代码是对错误的处理。 excpet块和else中的代码只会执行其一,try中无错误,则else就执行。
4.3 except 语句块
(一)使用异常类型 ErrorObjectError
try:
# ...
except ErrorObjectName:
# ...
else:
# ...
ErrorObjectName 是内的置异常错误对象,比如 FileNotFoundError 和 ZeroDivisionError 、SyntaxError 等等。
(二)不使用任何异常类型
try:
# ...
except:
# ...
else:
# ...
4.4 结合 pass 语句实现
except:
pass
5. 常见异常
| 异常名称 | 描述 |
|---|---|
Exception |
常规错误的基类 |
ZeroDivisionError |
除(或取模)零 (所有数据类型) |
IOError |
输入/输出操作失败 |
IndexError |
序列中没有此索引(index |
KeyError |
|
NameError |
未声明/初始化对象 (没有属性) |
FileNotFoundError |
|
SyntaxError |
Python 语法错误 |
StopIteration |
|
ImportError |
导入模块/对象失败 |
IndentationError |
缩进错误 |
TabError |
Tab 和空格混用 |
ValueError |
传入无效的参数 |
AttributeError |
对象没有这个属性 |
6. 存储数据
6.1 使用 json 库
使用 json.dump() 和 json.load() 来写入和读取json数据
json.dump(data, file_project)接收两个参数,要写入的数据
data和 写入的文件对象file_projectimport json filename = 'numbers.json' numbers = [12, 13, 14, 15, 16, 17, 18, 19, 20] with open(filename, 'w') as f_object: json.dump(numbers, f_object)json.load(file_project)with open(filename, 'r') as f_object: numbers = json.load(f_object) print(numbers)