一、文件读写实现原理和操作步骤
1.文件读写实现原理
文件读写就是一种常见的IO操作,Python封装了操作系统底层接口,直接提供了文件读写相关操作方法。
通常高级编程语言会提供一个内置的函数,通过接收文件路径以及文件打开模式等参数来打开一个文件对象,并返回该文件对象的文件描述符。因此通过这个函数我们就可以获取要操作的文件对象了。这个内置函数就是open()。
2.文件读写操作步骤
- 打开文件, 获取文件描述符
- 操作文件描述符 读/写
- 关闭文件
文件读写操作完成之后,应该及时关闭,以避免占用操作系统的资源,同时操作系统对同一时间能打开的文件描述符的数量是有限制的。
二、文件打开模式
常见的文件打开模式有:只读,只写,可读可写,只追加。
文件打开模式 | 描述 |
---|---|
r | 以只读模式打开文件,并将文件指针指向文件头,如果文件不存在会报错 |
w | 以只写模式打开文件,并将文件指针指向文件头,如果文件存在则其内容清空,如果文件不存在则创建 |
a | 以只追加可写模式打开文件,并将文件指针指向文件尾部,如果文件不存在则创建 |
r+ | 在r的基础上增加了可写功能 |
w+ | 在w的基础上增加了可读功能 |
a+ | 在a的基础上增加了可读功能 |
b | 读写二进制文件(默认是t,表示文本), 需要与上面几种模式搭配使用,如ab,wb,ab,ab+(POSIX系统, 包括Linux都会忽略该字符) |
r+、w+和a+都可以实现对文件的读写,他们有什么区别呢?
- r+会覆盖当前文件指针所在位置的字符,如原文件内容是“Hello,World”,打开文件后写入“hi” 则文件内容会变成“hillo, World”
- w+与r+的不同是,w+在打开文件时就会先将文件内容清空。
- a+与r+的不同是,a+只能写到文件末尾(无论当前文件指针在哪里)
三、Python文件操作步骤
- 简单实现
f = open('song.txt', 'r', encoding='utf-8') # 打开文件
print(f.read()) # 读取文件
f.close() # 关闭文件
- 中级实现
f = ''
try:
f = open('song.txt', 'r', encoding='utf-8')
print(f.read())
num = 10 / 0
finally:
print('>>>>>finally')
if f:
f.close()
- 最佳实现
with open('song.txt', 'r', encoding='utf-8') as f:
print(f.read())
print(f.close())
为了避免忘记或者为了避免每次都要手动关闭文件,我们可以使用with语句(一种语法糖,语法糖语句通常是为了简化某些操作而设计的),with语句会在其代码块执行完毕之后自动关闭文件。
四、Python文件读取相关方法
方法 | 描述 |
---|---|
read() | 一次读取文件所有内容,返回一个str |
read(size) | 每次最多读取指定长度的内容,返回一个str,在Python2中size指定的是字节长度,在Python3中size指定的是字符长度 |
readlines() | 一次读取文件所有内容,按行返回一个list |
readline() | 每次读取一行内容 |
此外,还要两个与文件指针位置相关的方法
方法 | 描述 |
---|---|
seek(n) | 将文件指针移动到指定字节的位置 |
tell() | 获取当前文件指针所在字节位置 |
1.读取指定长度的内容
with open('song.txt', 'r', encoding='utf-8') as f:
print(f.read(12))
python3中的read(size)方法的size参数指定的要读取的字符数,这与文件的字符编码无关,就是返回12个字符。
2.读取文件中的一行内容
with open('song.txt', 'r') as f:
print(f.readline().decode('utf-8'))
3.遍历打印一个文件中的每一行
- 先一次性读取所有行到内存,然后再遍历打印
with open('song.txt', 'r', encoding='utf-8') as f:
for line in f.readlines():
print(line)
这种方式的缺点与read()方法是一样的,都是会消耗大量的内存空间。
- 通过迭代器一行一行的读取并打印
witho open('song.txt', 'r', encoding='utf-8', newline='') as f:
for line in f:
print(line)
file类的其它方法:
方法 | 描述 |
---|---|
flush() | 刷新缓冲区数据,将缓冲区的数据立即写入文件 |
next() | 返回文件下一行,这个文件也是file对象实例可以被当成迭代器使用的原因 |
truncate([size]) | 截取文件中指定字节数的内容,并覆盖保存到文件中,如果不指定size参数则文件会被清空 |
write(str) | 将字符串写入文件,没有返回值 |
writelines(sequence) | 向文件写入一个字符串或一个字符串列表,如果字符串列表中的元素需要换行要自己加入换行符 |
fileno() | 返回一个整型的文件描述符,可以用于一些底层IO操作上(如,os的模块的read()方法) |
isatty() | 判断文件是否被连接到一个虚拟终端,是则返回True,否则返回False |
五、python操作文件夹方法
python使用os及shutill模块,其中包含了很多操作文件和目录的函数。
os可以执行简单的文件夹及文件操作,引入用import os, 可用help(os) 或是 dir(os) 查看其用法。注意有些函数在os模块中,有的是在os.path模块中。
shutil 模块提供了大量的文件的高级操作, 特别针对文件拷贝和删除。主要功能为目录和文件操作以及压缩操作。需引入import shutil 。
- os模块记录
- shutil模块记录