在python中可以通过文件操作,将数据保存到计算机硬盘中文件,可以包含文本数据,也可以包含二进制数据(图片,视频,音频等)。
目录
前言
如果我们想要将一个数据永久的保存到计算机中/读取计算机中的文件,那么我们就需要使用python中的文件操作,将指定的数据写到文件里/读取出来。一般而言读/写文件的操作分为三步:
1、打开文件 open()
2、操作文件
读:把文件里的内容读出来 read()
写:把内存中的内容写到文件里 write()
3、关闭文件 close()
注意为了避免系统资源浪费,同时也能保证数据不会丢失,在对一个文件操作结束时一定要关闭该文件。
正文
一、基本语法
1、函数open()打开file 返回一个文件对象
文件对象 = open('文件路径',mode='指定访问模式',encoding='指定编码格式')
1.1、文件路径
在文件的处理中文件的路径是尤为重要的,如果路径出现错误会引发代码或者程序的错误,一般而言我们的文件路径分为相对路径和绝对路径:
1)相对路径
相对路径通过当前执行文件所在的位置进行查找
如:aaa.txt 表示当前路径下的aaa.txt文件
同时我们可以通过不同的文件操作符来控制目录中的上下级:
../ 表示上一级目录
目录名/ 表示该目录下的文件
目录关系如下:
读取方式:
file1 = open('1.txt') # 读取当前目录下的文件
file2 = open('文件/2.txt') # 读取子目录中的文件
file3 = open('../3.txt') # 读取上一级的文件
# 以上操作可以组合起来
file4 = open('文件/../1.txt') # 读取下一级再读取上一级
file5 = open('../代码/文件/2.txt') # 读取上一级在读取下两级
2)绝对路径(完整的路径)
绝对路径通过指定该文件在电脑中的具体位置来对该文件进行操作。
如:F:\python\aaa.txt 表示在该电脑的f盘python目录下aaa.txt文件
1.2、访问模式mode
文件的读写模式 | ||
模式 | 模式名称 | 含义 |
r | 只读 | 只进行读取的操作,如果读取的文件不存在则会报错 |
w | 只写 | 只进行写的操作,如果读取的文件不存在则会创建一个新的文件,如果写入的文件中存在内容会被覆盖 |
a | 追加 | 进行写的操作,如果文件不存在则会创建一个新的文件,文件存在在会在该文件的末尾进行写入 |
组合字符 | ||
字符 | 名称 | 含义 |
b | 二进制 | 在文件的读写模式后添加b字符,表示读写二进制文件,如rb表示读取二进制文件 |
+ | 可读可写 | r+:表示可读写文件,会先进行读的操作,文件不存在会报错 |
w+:表示可读写文件,会先进行写的操作,文件不存在则创建新文件,打开文件会覆盖原来的内容 |
1.3、encoding = '指定编码格式'
如果读取或写入文件,和文件的编码格式指定的不匹配,将会出现乱码情况,这时就需要手动去指定编码格式。读二进制类型的数据(图片、视频) 不需要加上encoding
没有指定默认就操作系统使用自己默认的编码 Linux(utf-8) window(gbk)
2、文件中常用的方法
文件中常用的方法 | ||
操作 | 函数 | 含义 |
关闭文件 | 文件对象.close() | 向操作系统发生关闭文件请求 回收系统资源 |
读取文件内容 | 文件对象.read(n) | 读取文件里数据,n表示从文件中读取数据的长度,省略表示全部读取 |
文件对象.readline() | 一次读取一行的内容 | |
文件对象.readlines() | 按照行的方式一次性读取全部内容,返回数据是一个列表 | |
写入文件 | 文件对象.write(str) | 只能写入字符串类型 |
注意文件对象是可迭代对象,所以我们可以通过for循环来进行逐行读取
lin = 'abcd\nefg\nhijkl\n'
with open('3.txt', 'w') as f:
f.write(lin)
with open('3.txt', 'r', encoding='utf-8') as f:
for i in f:
print(i, end='')
3、实操:通过文件操作复制一张图片,并将其名称修改
# 打开文件
file1 = open('1.jpg', 'rb')
# 读取文件
img = file1.read()
# 关闭文件
file1.close()
file2 = open('1_copy.jpg', 'wb')
# 写入文件
file2.write(img)
file2.close()
二、with上下文管理
在对文件的处理中,如果我们遇见较多的操作就容易忘记关闭文件而造成资源的浪费,为了避免这总情况,我们通常会使用with语句来对文件进行操作。
语法:with open(文件位置,mode='模式',encodeing='编码') as 文件变量名:
文件变量名.write()
文件变量名.read()
同时with语句能使我们的代码更加简洁也能更加直观的表现出对某文件的操作过程。
如上面复制图片的过程可以写成:
with open('1.jpg', 'rb') as f1:
img = f1.read()
with open('1_copy.jpg', 'wb') as f2:
f2.write(img)
三、文件定位
在对文件进行读取时,文件读取的位置或随着读取字符个数而往后移动,如:
lin = 'abcd\nefg\nhijkl\n'
with open('3.txt', 'w') as f:
f.write(lin)
with open('3.txt', 'r', encoding='utf-8') as f:
print(f.read(5), end='')
print(f.read(5), end='')
可以看到虽然都是读取五个字符,但是结果却不同,这就是因为文件的读取位置发生了改变。如果我们需要多次读取同一块文件的数据或指定读取的位置,那我们可以通过seek函数来对文件的读取位置进行定位。
语法:文件变量名.seek(字节数,whence)
字节数:表示需要移动的个数
whence:表示要从哪个位置开始移动;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。默认值为 0。
注意:对于基于文本模式的文件对象(默认情况下是文本模式),只能从文件的开头(whence=0
)进行偏移量的设置,而不能从当前位置(whence=1
)或者文件末尾(whence=2
)。
lin = 'abcd\nefg\nhijkl\n'
with open('3.txt', 'w') as f:
f.write(lin)
with open('3.txt', 'r', encoding='utf-8') as f:
print(f.read(5), end='')
f.seek(0) # 表示从第零个字符开始读取
print(f.read(5), end='')
f.seek(2) # 表示从第二个字符开始读取
print(f.read(5), end='')
总结
Python提供的文件操作功能,使得处理文件变得高效且易于实现。在实际应用中,文件操作是Python编程中常见的任务之一,能够帮助实现数据的持久化存储和读取。是一个十分好用的操作。