第8章 文件与异常
8.1 文件及文件的基本操作
打开文件
文件——用来组织和管理一组相关数据的;
目录(文件夹)——是用来组织和管理一组相关文件的,可以包含文件,也可以包含其他目录。
格式: file 对象名 = open(file,mode='r',encoding=None,errors=None)
encoding: 用来指定打开文件时的文件编码,默认为UTF-8编码
errors: 指定文本文件发生错误编码时如何处理,推荐设为ignore,表示忽略错误,继续执行,不退出。
file:
- 可以是字符串(文件名)或整数(一个已打开的文件)
- 文件名可以是相对路径也可以是绝对路径。
- 采用绝对路径中的反斜杠( \ )需要转义,反斜杠( / )不需要转义。
mode:
| 含义(可组合使用) | |
|---|---|
| t | 以文本文件模式打开文件 |
| b | 以二进制文件模式打开文件 |
| r | 以只读模式打开文件 |
| w | 以只写模式打开文件,文件存在直接覆盖,不存在则创建 |
| x | 以独占创建模式打开文件,文件不存在,则创建并以写入模式打开,文件存在则异常 |
| a | 以追加模式打开文件,不能读内容,不存在则创建,存在则文件尾部追加 |
| + | 以更新模式打开文件,必须结合r、w、a组合使用才能为读写模式 |
关闭文件
格式: file对象名.close()
对文件操作往往会抛出异常,为了保证对文件的操作无论是正常结束还是异常结束,都能够关闭文件,通常将关闭方法放入异常处理的finally块中。
python提供了一个with as代码块,可以帮助我们自动释放资源,代替了finally
fs='test.txt'
# 使用 with as自动管理资源
with open(fs) as f:
content = f.read()
print(content)
读写文本文件
| 含义 | |
|---|---|
| read(size=-1) | 从文件中读取字符串,size限制读取的字符数,size=-1指对读取的字符数没有限制。 |
| readline(size=-1) | 在读取到换行符或文件尾时返回单行字符串。如果已经到文件尾,则返回一个空字符串。size是限制读取的字符数,size=-1表示没有限制。 |
| readlines() | 读取文件数据到一个字符串列表中,每一行数据都是列表的一个元素。 |
| write(s) | 将字符串s写入文件中,并返回写入的字符数。 |
| writelines(lines) | 向文件中写入一个字符串列表。不添加行分隔符,因此通常为每一行末尾都提供行分隔符。 |
| flush() | 刷新写缓冲区,在文件没有关闭的情况下将数据写入文件中。 |
| chdir() | 导入import os库可以修改文件路径 |
读写二进制文件
| 含义 | |
|---|---|
| read(size=-1) | 从文件中读取字节,size限制读取的字节数,如果size=-1,则读取全部字节。 |
| readline(size=-1) | 从文件中读取并返回一行。size是限制读取的行数,如果size=-1,则没有限制。 |
| readlines() | 读取文件数据到一个字节列表中,每一行数据都是列表的一个元素。 |
| write(b) | 写入b字节,并返回写入的字节数。 |
| writeline(lines) | 向文件中写入一个字节列表。不添加行分隔符,因此通常为每一行末尾都提供行分隔符。 |
| flush() | 刷新写缓冲区,在文件没有关闭的情况下将数据写入文件中。 |
8.2 CSV文件操作
CSV,是英文Comma-Separated Values的缩写,翻译为“逗号分隔值”。CSV文件可以理解为以带逗号分隔(也可以是其他简单字符分割)的纯文本形式存储表格数据的文件。
CSV文件,一般具有以下特征(用于不同程序之间转移表格数据):
- 1.纯文本,使用某个字符集,比如ASCII、Unicode或GB2312;
- 2.由记录组成,一行对应一条记录,每行开头不留空格;
- 3.每条记录被英文半角分隔符(可以使逗号、分号、制表符等)分割为字段;
- 4.每条记录都有同样的字段序列;
- 5.如果文件包含字段名,字段名写在文件第一行;
- 6.不包含特殊字符,文件中均为字符串。
针对CSV文件,Python提供了内置同名模块csv进行读写操作,读操作使用模块中的reader对象,写操作使用模块中的writer对象。
CSV文件进行读、写操作前也需要先打开文件(import csv)。
import csv
scores='C:/Users/Toro/Desktop/score.csv'
with open(scores,encoding='UTF-8',mode='r') as f:
#先创建一个reader对象。
reader = csv.reader(f)
header = next(f) # 忽略第一行标题
#然后通过迭代遍历reader对象读出文件中的每一行
for row in reader:
print(row)
打开文件时增加一个参数newline=‘“”,指明在写入新的记录后不插入空行
8.3 异常和异常处理
异常: 影响了程序的正常执行,导致程序非正常终止。
| 异常名称 | 描述 |
|---|---|
| Exception | 常规异常的基类 |
| ZeroDivisionError | 除数为零 |
| IOError | 输入/输出操作失败 |
| IndexError | 序列中没有此索引(index) |
| KeyError | 映射中没有这个键 |
| NameError | 未声明/初始化对象 (没有属性) |
#如果try子句中发生了指定的异常,则执行except子句部分进行异常的处理;
#如果try子句执行未发生异常则执行else子句部分。
try:
语句
#如果不知道异常类型,或者想对所有类型的异常进行捕获,可以省略except后面的异常类型,直接接冒号
#如果不确定异常类型,可以使用通用的异常对象Exception来捕获
except 异常名称:
捕获异常时处理
else:
未发生异常时处理
8.4 读写excel/word文件
Python和Word结合可完成一些文档自动生成的工作。包docx是读写word文件的第三方包。
安装命令 pip install python-docx
官网教程 python-docx.readthedocs.io/en/latest/
1.建立新的Word文档
from docx import Document
#调用Document对象的save方法,一个Document对象代表一个Word文档
doc=Document()
doc.save('text.docx')
2.添加段落和段落文字
添加段落需要调用Document对象的add_paragraph方法,返回Paragraph对象
调用Paragraph对象的add_run方法为段落添加文字,返回Run对象,对Run对象可以设置加粗(bold)、斜体(italic)等格式。
from docx import Document
doc=Document()
p=doc.add_paragraph('无格式的部分')
p.add_run('加粗部分').bold=True
p.add_run('无格式')
p.add_run('斜体部分').italic=True
doc.save('teXt.docx')
3.读取文档的所有段落
Document对象的paragraphs属性是一个包含文档所有Paragraph对象的对象列表,对其进行遍历可以操作文档的所有段落。
from docx import Document
doc=Document('text.docx')
for p in doc.paragraphs:
print(p.text)
4.读取文档表格中的文字
Document对象的tables属性是一个包含所有Table对象的列表对象。
Table对象的cells属性是一个包含表格所有_Cell单元格对象的列表。
对cells属性进行循环遍历可以操作表格所有的单元格。
from docx import Document
doc=Document('Python.docx')
for t in doc.tables:
for c in t._cells:
print(c.text)
包openpyxl是读写xlsx文件的一个第三方包,这个包的安装命令如下: pip install openpyxl
1.创建Excel电子表格
from openpyxl import Workbook
#调用Workbook对象的save方法
wb=Workbook()
wb.save('test.xlsx')
2.创建工作表
from openpyxl import Workbook
wb=Workbook()
#调用Workbook对象的create_sheet方法
wb.create_sheet('first')
wb.create_sheet('second')
wb.save('test.xlsx')
3.修改单元格的数据
调用load_workbook()函数打开工作簿
一个工作簿包含一系列工作表Worksheet,一个工作表中有多个单元格Cell
from openpyxl import load_workbook
wb=load_workbook('test.xlsx')
ws=wb.get_sheet_by_name("first")
ws['A1']='数学'
ws['b1']='语文'
ws.cell(2,1,90)
ws.cell(2,2,91)
ws.append([80,81])
ws['c2']='=sum(A2:B2)'
ws['c3']='=sum(A3:B3)'
wb.save('test.xlsx')
4.读取Excel单元格中的数据
from openpyxl import load_workbook
wb=load_workbook('test.xlsx')
ws=wb['first']
#根据单元格坐标获取一个Cell对象,访问其value属性
print(ws['A1'].value)
print(ws.cell(2,3).value)