文件操作
文件操作三部曲;
1、打开文件
2、对文件句柄操作
3、关闭文件
f1 = open('测试1',encoding='utf-8',mode='r') content = f1.read() print(content) f1.close()
open() 方法用于打开一个文件,并返回文件对象,open底层调用的是操作系统的接口,如果该文件无法被打开,会抛出 OSError。
f1,变量,f1,fh,file+handler,f_h,文件句柄,对文件进行任何操作,都是通过文件句柄的方式,
编码方式encoding:可以不写,不写参数默认编码本;操作系统默认编码;
一般来说:你的文件用什么编码保存的,就用什么方法打开,一般都是用utf-8(有些使用的是gbk)
Windows:gbk,
Linux:utf-8
Mac:utf-8,
close() :使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。
参数说明:
- file: 必需,文件路径(相对或者绝对路径)。
- mode: 可选,文件打开模式
- buffering: 设置缓冲
- encoding: 一般使用utf8
- errors: 报错级别
- newline: 区分换行符
- closefd: 传入的file参数类型
- opener:
不同打开文件方式:


文件方法:

文件操作的操作模式分为三个类:读,写,追加。
#1. 打开文件的模式有(默认为文本模式): r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】 w,只写模式【不可读;不存在则创建;存在则清空内容】 a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】 #2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式) rb wb ab 注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码 #3,‘+’模式(就是增加了一个功能) r+, 读写【可读,可写】 w+,写读【可写,可读】 a+, 写读【可写,可读】 #4,以bytes类型操作的读写,写读,写读模式 r+b, 读写【可读,可写】 w+b,写读【可写,可读】 a+b, 写读【可写,可读】
读:读的四种模式:r,rb,r+,r+b
r只读模式
以只读方式打开文件,文件的指针将会放在文件的开头。是文件操作最常用的模式,也是默认模式,如果一个文件不设置mode,那么默认使用r模式操作文件。
# r 只读 f = open('测试1',encoding='utf-8',mode='r') ''' #r = f.read() #全部读取,弊端 如果文件很大就会非常的占用内存,容易导致内存奔溃. r = f.read(2) #按照字符读取,从1开始 print(r) # type(r) <class 'str'> r1 = f.readline().strip() # readline()读取一行 r2 = f.readline().strip() # 注意点:readline()读取出来的数据在后面都有一个\n,所以需要加一个strip() print(r1) print(r2) r3 = f.readlines() # readlines() 返回一个列表,列表里面每个元素是原文件的每一行,如果文件很大,占内存,容易崩盘。 print(r3) # ['杨洋\n', '刘诗诗\n', '肖战'] ''' #可以通过for循环去读取,文件句柄是一个迭代器,他的特点就是每次循环只在内存中占一行的数据,非常节省内存 for line in f : print(line.strip()) #这种方式就是在一行一行的进行读取, f.close()
读:rb以二进制格式打开一个文件用于只读模式:
rb模式:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。记住下面讲的也是一样,带b的都是以二进制的格式操作文件,他们主要是操作非文字文件:图片,音频,视频等,并且如果你要是带有b的模式操作文件,那么不用声明编码方式。
# rb f = open('宝可梦.jpg',mode='rb') r = f.read() print(r) # b'\xff\xd8\xff\xe0... f.close()
rb模式也有read read(n) readline(),readlines() for循环这几种方法;
r+读写模式
r+: 打开一个文件用于读写。文件指针默认将会放在文件的开头。
# 如果你在读写模式下,先写后读,那么文件就会出问题,因为默认光标是在文件的最开始,你要是先写,则写入的内容会讲原内容覆盖掉,直到覆盖到你写完的内容,然后在后面开始读取。 f = open('测试1',encoding='utf-8',mode='r+') r = f.read() print(r) f.write('\n嗯哼') f.close()
写:四种模式:w,wb,w+,w+b
w模式
写就是在文件中写入内容。这里也有四种文件分类主要四种模式:w,wb,w+,w+b,
#如果文件不存在,利用w模式操作文件,那么它会先创建文件,然后写入内容. #如果文件存在,利用w模式操作文件,先清空原文件内容,在写入新内容。 f = open('测试2',encoding='utf-8',mode='w') r = f.write("哈哈") #以字符串类型写入 f.close()
wb模式:
以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如:图片,音频,视频等。
#第一步:将原图片通过rb模式读取出来 f = open('宝可梦.jpg',mode='rb') r = f.read() f.close() #第二步:将读取出来的数据通过wb模式写入新文件 f1 = open('宝可梦1.jpg',mode='wb') f1.write(r) f.close()
追加:四种模式:a,ab,a+,a+b
a模式
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
f = open('测试2',encoding='utf-8',mode='a') f.write('\nbb') f.close()
打开文件的另一种方式
Python也给咱们提供了另一种方式:with open() as .... 的形式,那么这种形式有什么好处呢?
# 1,利用with上下文管理这种方式,它会自动关闭文件句柄。 with open('测试1',encoding='utf-8') as f: print(f.read()) # 2,一个with 语句可以操作多个文件,产生多个文件句柄。 with open('测试1',encoding='utf-8') as f1,\ open('测试2',encoding='utf-8',mode='w') as f2: print(f1.read()) f2.write('aa')
这里要注意一个问题,虽然使用with语句方式打开文件,不用你手动关闭文件句柄,比较省事儿,但是依靠其自动关闭文件句柄,是有一段时间的,这个时间不固定,所以这里就会产生问题,如果你在with语句中通过r模式打开t1文件,那么你在下面又以a模式打开t1文件,此时有可能你第二次打开t1文件时,第一次的文件句柄还没有关闭掉,可能就会出现错误,他的解决方式只能在你第二次打开此文件前,手动关闭上一个文件句柄。
文件的修改:
文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:
方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)
import os # 1、以读模式打开原文件 # 2、以写模式创建一个新文件 with open('测试1',encoding='utf-8') as f1,\ open('测试2',encoding='utf-8',mode='w') as f2: # 3、将原文件的内容读出来修改成新内容,写入新文件 old_content = f1.read() new_content = old_content.replace('三三','四四') f2.write(new_content) # 4、将原文件删除 os.remove('测试1') # 5、将新文件重命名成原文件 os.rename('测试2','测试1')
方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
import os with open('测试1',encoding='utf-8') as f1,open('测试2',encoding='utf-8',mode='w') as f2: for line in f1: line = line.replace('四四','五五') f2.write(line) os.remove('测试1') os.rename('测试2','测试1')
详细操作:
'''文件操作''' #只读r #open() 方法一定要保证关闭文件对象,即调用 close() 方法 # f=open('C:\\Users\\12978\Desktop\\foin.txt',mode='r',encoding='utf-8') #绝对路径 # content=f.read() # print(content,type(content)) #类型为str # f.close() #rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头 # f=open('C:\\Users\\12978\Desktop\\foin.txt',mode='rb') # content=f.read() # print(content,type(content)) #类型为bytes # f.close() #结果:b'\xef\xbb\xbf\xe4\xbd\xa0\xe5\xa5\xbd\xe9\xb8\xad' #r+ 读写 # f=open('C:\\Users\\12978\Desktop\\foin.txt',mode='r+',encoding='utf-8') # print(f.read()) # f.write('小明,晓红') # f.close() #r+b 读写(以bytes类型)以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头 # f=open('C:\\Users\\12978\Desktop\\foin.txt',mode='r+b') # print(f.read()) # f.write('小明,晓红'.encode('utf-8')) # f.close() #只写:w 打开一个文件只用于写入。该文件不存在,创建新文件。 # 先将源文件的内容全部清除,在写。 # f=open('C:\\Users\\12978\Desktop\\foin.txt',mode='w',encoding='utf-8') # f.write('大王,小王') # f.close() #wb 以二进制格式打开一个文件只用于写入 # f=open('wa.txt',mode='wb',) # f.write('哇哈哈'.encode('utf-8')) # f.close() #w+打开一个文件用于读写 # f = open('wa.txt',mode='w+',encoding='utf-8') # f.write('aaa') # f.seek(5) #设置文件当前位置,移动到当前文件第6个字节 # print(f.read()) # f.close() # a 追加 # f = open('wa.txt',mode='a',encoding='utf-8') # f.write('huahua') # f.close() #ab一二进制文件追加 # f = open('wa.txt',mode='ab') # f.write('我是新星星'.encode('utf-8')) # f.close() #功能详解 f=open('C:\\Users\\12978\Desktop\\foin.txt',mode='r',encoding='utf-8') #绝对路径 content=f.read(2) #read() 方法用于从文件读取指定的字节数,如果未给定或为负则读取所有 f.seek(3) #是按照字节定光标的位置 f.tell() print(f.tell()) #打印出光标得位置 f.readable() # 是否刻度 line = f.readline() # 一行一行的读 line = f.readlines() # 每一行当成列表中的一个元素,添加到list中 for line in f: print(line) print(content,type(content)) #类型为str f.close()
登录和注册例子
#登录注册 username=input('请输入你要注册得用户名:') password=input('请输入你要注册得密码:') with open('list_of_info',mode='w',encoding='utf-8') as f: f.write('{}\n{}'.format(username,password)) print('注册成功') list=[] i=0 while i<3: name=input("请输入用户名:") pwd=input('请输入密码:') with open('list_of_info',mode='r+',encoding='utf-8') as f1: for line in f1: list.append(line) if name == list[0].strip() and pwd == list[1].strip(): print('登录成功') break else: print('账号和密码错误') i+=1
浙公网安备 33010602011771号