第8章 文件与异常

81 阅读7分钟

第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组合使用才能为读写模式

image.png

关闭文件

格式: 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)