python办公自动化(入门)
持久化:内存(不能长时间保存数据)到硬盘(可以长时间保存数据)
文件系统:存储和管理数据的一种方式
格式化硬盘的时候就是在创建一个文件系统
open()函数
在python中使用操作文件之前,需要使用open()打开文件,其会返回一个文件对象。
下面时open函数的参数列表:
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
file:要创建或者打开的文件。通常为:文件路径/文件名.文件格式
mode:可选参数,指定文件的打开模式,默认为只读的方式打开
buffering:可选参数,用于设置缓冲策略。具体操作在进阶里面说
encoding:可选参数,用于解码或编码的编码名称文件
errors:可选参数,errors是一个可选字符串,用于指定如何处理编码错误。这个参数不应该在二进制模式下使用
newline:可选参数,控制通用换行符的工作方式
closefd:默认值值为True,如果closefd为False,底层文件描述符将保持打开状态当文件关闭时。当给定了文件名时,这就不起作用了并且在这种情况下必须为真
文件的操作模式(mode参数)有如下几种:
操作模式 | 具体含义 |
---|---|
r | 读取 (默认) |
w | 写入(会先截断之前的内容) |
x | 写入,如果文件已经存在会产生异常 |
a | 追加,将内容写入到已有文件的末尾 |
b | 二进制模式 |
t | 文本模式(默认) |
+ | 更新(既可以读又可以写) |
这里我们只需要先了解file、mode、encoding这三个参数
读取文件内容
致橡树.txt 文档
# 返回一个文件对象
file = open(file ='致橡树.txt', mode ='r', encoding ='utf-8')
# 读取所有内容
print(file.read())
# 切记,每次打开文件之后一定要关闭文件,不然文件会一直占用缓存
file.close()
'r’以只读的方式打开,同时选取utf-8作为文件的编码方式(我的编译器编码方式为utf-8,而致橡树.txt文件的编码方式为gbk,所以需要把文档的编码改为utf-8)
如何查看编译器编码:
import sys
print(sys.getdefaultencoding()) # 查看文件编码
这里有一个问题,就是如果在文件关闭之前,前面的代码出现错误,从而导致无法执行文件关闭的语句,这样怎么办呢?
这里我们可以使用一个异常处理语句try-finally,无论try语句里面的内容是否出现异常,始终都会执行finally语句块里面的内容。
代码如下:
# 返回一个文件对象
file = open(file ='致橡树.txt', mode ='r', encoding ='utf-8')
try:
# 读取所有内容
print(file.read())
finally:
# 关闭文件
file.close()
print('关闭文件成功')
以后我们都将使用上面这个格式去操作文件。
当一个文件很大时,这里将耗费很多时间和缓存,我们可以分批次读取
# 返回一个文件对象
file = open(file ='致橡树.txt', mode ='r', encoding ='utf-8')
try:
# 一次只读32个字节,读不到数据则返回None
data = file.read(32)
while data:
print(data, end = '')
data = file.read(32)
finally:
# 关闭文件
file.close()
print('关闭文件成功')
写入内容
如果要向文件中写入内容,我们需要将文件的打开模式改为a或者w
这里我们打开一个新的空白文件(文件不存在就在当前路径下创建一个新文档)
这里我们文件打开模型选择为w,为只读模式,我不能对其进行读操作。
# 打开 小雨康桥的诗.txt 文件
file = open('小雨康桥的诗.txt', mode = 'w', encoding = 'utf-8')
try:
# 写入内容
file.write('我只想做燕子\n')
file.write('只需简单思想\n')
file.write('只求风中流浪\n')
file.write('我想作树\n')
file.write('不想长五脏六腑\n')
file.write('不会肝肠寸断\n')
finally:
# 关闭文件
file.close()
print('关闭文件成功')
如果我们还行在文件后面继续写入文件,我们可以进行如下操作
# 打开 小雨康桥的诗.txt 文件 将文件操作模式设置为a
file = open('小雨康桥的诗.txt', mode = 'a', encoding = 'utf-8')
try:
# 写入内容
file.write('我做不成燕子\n')
file.write('所以我飞不过感情的墙\n')
file.write('我做不成树\n')
file.write('因此也撑不破伤心的网\n')
finally:
# 关闭文件
file.close()
print('关闭文件成功')
读写二进制文件
先给大家介绍一个函数seek()。我们可以使用它移动文件指针到指定位置,然后进行读写。
seek(移动字节数,移动模式):
移动模式有三种,如下:
0:默认的模式,以文件开头为初始点移动移动指针;
1:以当前指针所在位置为初始点移动指针;
2:以文件末尾为初始位置移动指针;
强调:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用
实例:
file = open('小雨康桥的诗.txt', mode = 'w', encoding = 'utf-8')
try:
# 打印当前文件指针的位置
print(file.tell()) # 200
# 将文件指针移到开头
file.seek(0, 0)
print(file.tell()) # 0
# 将文件指针移到第八个字节
file.seek(8, 0)
print(file.tell()) # 8
finally:
file.close()
这里我们文件的操作模式为w,所以不能使用seek(n,1) 、seek(n, 2) (n表示移动字节数)
以二进制形式打开文件,以图片为例,该图片为一个截图
# 导入模块,模块作用如下
from io import SEEK_END, SEEK_SET
# 读取一个图片,以二进制的模打开
file = open(file = 'image.jpg', mode = 'rb')
# 移动文件指针至文件末尾,获取文件长度
file.seek(0, SEEK_END)
# 通过tell方法获取文件指针移动的字节数,这个字节数就是文件的大小
print(file.tell())
# 将文件指针移动到最初的位置
file.seek(0, SEEK_SET)
try:
data = file.read(512)
while data:
print(data, end = '')
data = file.read()
finally:
file.close()
print('关闭文件')
上下文语法
对于open函数,我们还可以用with上下文语法,使用with上下文语法会在结束文件操作之后,会自动保存文件,这样我们就不需要再写finally语句在执行close方法了,让代码变得更简洁。不过并不是所有的对象都可以使用with上下文语法,必须符合上下文管理器协议的对象(有__enter__
和__exit__
魔术方法)才可以使用。
实例:
# 读文件
with open('小雨康桥的诗.txt', 'r', encoding = 'utf-8-sig') as file:
# 输出文件内容
print(file.read())
# 写文件
with open('小雨康桥的诗.txt', 'a', encoding = 'utf-8-sig') as file2:
# 写入内容
file2.write('我做不成燕子\n')
file2.write('所以我飞不过感情的墙\n')
file2.write