文件处理
文件操作的作用就是 把一些内容(数据)存储存放起来,可以让程序下一次执行的时候直接使用
,python提供了 open
关键字来处理 文件的读写。
语法
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
file参数代表文件名
, 如果不带上路径的话,会在当前文件夹里查找, 而mode参数代表文件的打开模式
,有如下表所示的几种打开模式
基本流程
# 1. 打开文件,由应用程序向操作系统发起系统调用open(...),操作系统打开该文件,对应一块硬盘空间,并返回一个文件对象赋值给一个变量f
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r
# 2. 调用文件对象下的读/写方法,会被操作系统转换为读/写硬盘的操作
data=f.read()
# 3. 向操作系统发起关闭文件的请求,回收系统资源
f.close()
with上下文管理
每次打开文件处理完之后都要 手动关闭文件
,这样就显得比较繁琐,python 提供给了 with
关键字来帮我们自动关闭文件
with open('a.text', 'r', encoding='utf-8') as f:
data = f.read()
print(data)
字符集编码
,如果打开的是文本文件,会涉及到字符编码问题,如果没有为open指定编码,那么打开文本文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
f = open('a.txt','r',encoding='utf-8')
操作文件模式
模式 | 作用 |
---|---|
r | 只读模式打开,默认 |
w | 写模式打开,若文件存在,先删除,然后重新创建 |
a | 追加模式打开,追加到文件末尾,seek()指向其他地方也没用,文件不存在,自动创建 |
b | 二进制模式打开 |
t | 文本模式打开,默认 |
+ | 可读写模式,可配合其他模式使用,比如r+,w+ |
x | 如果文件已存在,用此模式打开会引发异常 |
U | 通用换行符支持 |
inp_name = input('请输入用户名: ').strip()
inp_pwd = input('请输入密码: ').strip()
with open(r'db.txt', mode='r', encoding='utf-8') as f:
for line in f:
# 把用户输入的名字与密码与读出内容做比对
u, p = line.strip('\n').split(':')
if inp_name == u and inp_pwd == p:
print('登录成功')
break
else:
print('账号名或者密码错误')
with open('b.txt', mode='w', encoding='utf-8') as f:
f.write('你好\n')
f.write('我好\n')
f.write('大家好\n')
f.write('111\n222\n333\n')
# 强调:
# 1 在文件不关闭的情况下,连续的写入,后写的内容一定跟在前写内容的后面
# 2 如果重新以w模式打开文件,则会清空文件内容
# a只追加写模式: 在文件不存在时会创建空文档,文件存在会将文件指针直接移动到文件末尾
with open('c.txt', mode='a', encoding='utf-8') as f:
f.write('44444\n')
f.write('55555\n')
# 强调 w 模式与 a 模式的异同:
# 1 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后
# 2 不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后
操作文件的方法
# 读操作
f.read() # 读取所有内容,执行完该操作后,文件指针会移动到文件末尾
f.readline() # 读取一行内容,光标移动到第二行首部
f.readlines() # 读取每一行内容,存放于列表中
# 强调:
# f.read()与f.readlines()都是将内容一次性读入内容,如果内容过大会导致内存溢出,若还想将内容全读入内存,则必须分多次读入,有两种实现方式:
# 方式一
with open('a.txt', mode='rt', encoding='utf-8') as f:
for line in f:
print(line) # 同一时刻只读入一行内容到内存中
# 方式二
with open('1.mp4', mode='rb') as f:
while True:
data = f.read(1024) # 同一时刻只读入1024个Bytes到内存中
if len(data) == 0:
break
print(data)
# 写操作
f.write('1111\n222\n') # 针对文本模式的写,需要自己写换行符
f.write('1111\n222\n'.encode('utf-8')) # 针对b模式的写,需要自己写换行符
f.writelines(['333\n', '444\n']) # 文件模式
f.writelines([bytes('333\n', encoding='utf-8'), '444\n'.encode('utf-8')]) # b模式
其他操作
f.readable()
# 文件是否可读
f.writable()
# 文件是否可读
f.closed
# 文件是否关闭
f.encoding
# 如果文件打开模式为b,则没有该属性
f.flush()
# 立刻将文件内容从内存刷到硬盘
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。