python办公自动化(入门)

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
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值