文件在作为计算机的重要组成部分,程序本质上也是文件。很多时候我们需要将数据保存到本地,这个时候就需要对文件进行操作。
一、打开文件
在Python中,我们利用open()函数来打开一个文件。
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
- file:文件路径"
- encoding:读取文件的编码格式,默认为"UTF-8"
- buffering: 设置缓冲
- mode:打开文件的模式
- errors: 报错级别
- newline: 区分换行符
- closefd: 传入的file参数类型
- opener:自定义开启器
文件路径分为绝对路径和相对路径:
相对路径:如果目标文件和当前文件在同一级目录下,则直接使用文件名即可打开
绝对路径:从根目录开始书写,每一级直接用"/"隔开
打开文件的模式:
t | 文本模式 (默认) |
x | 写模式(新建一个文件,如果该文件已存在则会报错 ) |
b | 二进制模式 |
+ | 打开一个文件进行更新(可读可写) |
r | 以只读方式打开文件,文件的指针在文件的开头(默认) |
rb | 以二进制格式打开一个文件用于只读,文件指针在文件的开头(默认模式) |
r+ | 打开一个文件用于读写,文件指针在文件的开头 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针在文件的开头 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,原有内容会被删除。如果该文件不存在,创建新文件 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,原有内容会被删除。如果该文件不存在,创建新文件 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件存在则打开文件,并从开头开始编辑,原有内容会被删除。如果该文件不存在,创建新文件 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入 |
ab | 以二进制格式打开一个文件用于追加。如果该文件存在,文件指针将会放在文件的结尾。新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写 |
open函数会返回一个对象,该对象代表当前打开的文件。
二、关闭文件
当文件操作完毕后应当关闭文件,如果不关闭文件则会一直占用系统内存资源。
利用close()方法关闭文件
# 打开文件
f = open('python.txt', 'r')
# 关闭文件
f.close()
三、with语句
在Python中我们可以利用with语句打开文件。利用with语句打开文件,当文件操作完毕后自动关闭文件,不需要我们手动关闭,推荐在实际编写过程中使用with语句打开文件。
with open('Python.txt', 'r') as f:
pass
# 和上述代码功能相同
f = open('Python.txt', 'r')
f.close()
四、文件的读写
一般文件的读写
读取文件:先将文件打开模式设置为可读取,再利用read()方法进行读取文件内容。
read()方法在读取文件时会一次性读取文件的所有内容,将它放到缓冲区。
写入文件:先将文件打开模式设置为可写入,再利用write()方法进行读取文件内容。write()方法可以将字符串写入文件中,并返回写入字符串地长度。
# 以读写模式打开文件
with open('Python.txt', 'w+') as f:
# 写入文件
f.write('Python')
# 读取文件
file = f.read()
print(file) # Python
大型文件的读写
由于read()和write()会一次性读取和写入文件,当文件较大时如果选择一次性读写,那么很有可能会造成内存资源消耗完毕,长时间停留在此操作,导致程序出现崩溃。
为了解决这个问题,我们选择在读写文件时进行限流处理,限制每一次读写文件的数量,以此来避免出现内存占用完毕的现象。
读取优化
设置size对read()方法限流:
read()方法中可以接收一个size参数,这个参数代表了本次读取的文件的多少;
默认值为-1,代表读取整个文件;
当读取模式为文本模式时,size代表字符数量,当为二进制文件时,size代表字节数量。如果剩余数量小于size,那么则会将剩下的全部读取;
read()方法每一次读取文件,都会从上一次读取结束位置开始。
with open('Python.txt', 'r') as f:
file = ""
while True:
# 每次读取十个字符
content = f.read(10)
if not content:
break
file += content
print('文件读取完毕')
使用readline()和readlinse()方法进行限流:
readline()和readlines()方法读取文件时都是一行一行地读取文件。readlines()读取文件后会将读取到地文件封装到列表中返回。
with open('Python.txt', 'r') as f:
file = ""
while True:
# 每次读取十个字符
content = f.readline()
if not content:
break
file += content
# 效果一样
content = f.readlines()
for i in content:
file += i
print('文件读取完毕')
写入优化
利用writelines()方法写入文件,该方法在写入字符串时会进行迭代操作,以换行符为分隔进行迭代。
with open('Python.txt', 'w') as f:
f.writelines('P\ny\n') # 内部写入时会分两次写入
文件指针操作
tell():返回文件的当前位置
with open('Python.txt', 'w+') as f:
f.write('1:Python\n2:C++')
print(f.readline())
print('当前位置:', f.tell())
seek():用于移动文件读取指针到指定位置
语法:fileObject.seek(offset[, whence])
offset: 开始的偏移量,也就是代表需要移动偏移的字节数
whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
with open('Python.txt', 'w+') as f:
f.write('1:Python\n2:C++')
a = f.readline()
print(a) # 1:Python
f.seek(10, 0)
b = f.readline()
print(b) # 1:Python
五、os模块
os 模块是Python地一个内置模块,它提供了非常丰富的方法用来处理文件和目录。
常用方法:
- listdir() :获取当前目录结构
- chdir():切换盘符
- getcwd() :获取当前所在的目录
- mkdir():创建目录 在当前目录创建
- rmdir():删除目录
- open():打开文件,设置打开选项,mode参数可选
- remove():删除指定路径的文件