(十二)文件和异常
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_project
import 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)