文件操作
what and why?为什么需要文件?
答:通过之前的计算机基础,我们知道,数据如果想要永久保存下去,就需要存储到硬盘中。但是,应用程序是不可以直接操作硬件的,所以需要用到操作系统。操作系统把复杂的硬件操作封装成接口提供给应用程序,文件就是其中用来操作硬盘的虚拟概念。读写文件其实就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从文件中读取数据(读文件),或者把数据写入(写文件)。
how?如何进行文件操作?
答:前提需要三要素:
(1)文件路径
(2)文件的编码方式
(3)文件的打开方式:只读,只写,追加,读写...
打开文件:
f = open('E:python_training_s1day8\testfile.txt',encoding='utf-8',mode='r') content = f.read() print(content) f.close()
f :本质就是一个普通的变量名,代表文件对象,文件句柄,用来文件操作。
通常的名为有: f,f_obj,f_handler,f_h,fh...
open():打开文件,调用的是操作系统的open命令。参数为文件的三要素。
close():关闭文件,释放内存地址。
'''
常见错误:
(1)unicodedecodeerror:文件存储和打开的编码不一致。
(2)OSError:有 ,
这种特殊字符,需要用raw str或者\解决
'''
读:
打开方式(mode):r,rb,r+,r+b
读的五种方法:
(1)f.read():把文件全部内容一次性读取进内存中。如果文件过大,会撑爆内存。
(2)f.read(n): 在‘r’模式下,n代表字符;在‘rb’模式下,n代表的是字节。
(3)f.readline(): 一次读取一行
(4)f.readlines(): 返回一个列表,文件一行的内容就是列表的一个元素。
(5)for line in f: 循环句柄,这种方式一次只会在内存开辟一行的空间。推荐。
#前提:从文件中读进来的内容的数据类型都是字符串str类型 #文件的内容:我在学习python
python is elegant '''f.read():一次性把文件的内容都读进内存中。缺点:如果文件过大,会撑爆内存''' f = open('testfile.txt','r',encoding='utf-8') content = f.read() print(content) f.close() >>>'我在学习python' '''f.read(n):在r模式下,n为字符;在rb模式下,n为字节 ''' f = open('testfile.txt',encoding='utf-8',mode='r') content = f.read(3) print(content) f.close() >>>'我在学' f = open('testfile.txt','rb') content = f.read(3) print(content) f.close() >>>b'xe6x88x91' #utf-8编码下,一个汉字为3个字节。 '''f.readline():一次读取一行,缺点:每次读一行需要调用一次readline(),效率低''' f = open('testfile.txt','r',encoding='utf-8') line1 = f.readline() #打印第一行 line2 = f.readline() #打印第二行 print(line1) print(line2) f.close() '''f.readlines():返回一个列表,一行就是列表的一个元素''' f = open('testfile.txt','r',encoding='utf-8') content = f.readlines() print(content) f.close() >>> ['我在学习python ', 'python is elegant'] '''for line in f: 循环文件句柄,每次只会在内存中创建一行''' f = open('testfile.txt','r',encoding='utf-8') for i in f: print(i.strip()) f.close() >>> 我在学习python python is elegant
写:
打开方式:w,wb,w+
f.write(): 如果没有此文件,创建文件并写入;如果文件存在内容,先清空后写入。
#如果文件不存在,会创建文件。 f = open('test.txt','w',encoding='utf-8') f.write('哈哈哈') f.close() # 如果文件存在且有内容,会清空原内容后写入 f = open('testfile.txt','w',encoding='utf-8') f.write('哈哈哈') f.close() # wb : 以二进制的方式写入(bytes类型) # f = open('testfile.txt','wb') # f.write('呵呵呵'.encode('utf-8')) # f.close()
追加:
打开方式:a,ab.. 把内容追加到文件的末尾
f.write()
f = open('testfile.txt','a',encoding='utf-8') f.write(' python is cool') f.close()
读写:
mode=‘r+’,先读后写(关键在光标的位置)
一.先读,后追加。不管读多少个字符,光标都置于末尾,在末尾追加内容。
#文件内容 '''我在学习python python is elegant''' 情景一:f.read() f = open('testfile.txt',encoding='utf-8',mode='r+') content = f.read() print(content) f.write('hahaha') f.close() >>> 我在学习python python is eleganthahaha 情景二: f.read(n) f = open('testfile.txt','r+',encoding='utf-8') content = f.read(6) print(content) f.write('hahaha') f.close() >>> 我在学习py
二.先写,后读。先按照写入的字节长度替换内容,接着把光标后的内容读出来。
f = open('testfile.txt','r+',encoding='utf-8') f.write('hahaha') content = f.read() print(content) f.close() >>> 学习python python is eleganthahaha
写读:
打开方式:w+,先写后读
先清空后写入,此时光标在最后的位置,再读根本毫无意义。除非结合f.seek()移动光标,再进行读取。
f = open('testfile.txt','w+',encoding='utf-8') f.write('java is good') content = f.read() print(content) #此时光标在最后面,content的内容就是行末的换行符 f.close() >>> ' ' # 先写后读,结合f.seek()移动光标 f = open('testfile.txt','w+',encoding='utf-8') f.write('java is better') f.seek(0) #f.seek(0)表示把光标移到文件的开头处 content = f.read() #此时,content的内容就为新吸入的内容 print(content) f.close() >>> java is better
追加可读:
打开方式:a+
与w+的效果一样,需要结合f.seek()。
文件操作常用方法:
(1) f.close() : 关闭文件
(2) f.read(n) : 默认把文件的所有内容都读取出来;如果有n选项,在r模式下,n代表字符;在rb模式下,n代表字节。
(3)f.readable() : 文件是否可读,返回True/False
(4)f.readline() :每次读取文件的一行内容
(5)f.seek():调整光标的位置,按照字节数调整。f.seek(0):光标跳转到文件开头处。f.seek(0,2):光标跳转到文件末尾处.
(6)f.tell(): 获取当前光标所在位置,也是按照字节;常与f.seek()一起使用。
(7)f.truncate():在写模式下,截断数据;按照字节数保留指定之前的数据。
# 文件内容: python is cool f = open('testfile.txt','a',encoding='utf-8') f.truncate(2) #截取保留两个字节 f.close()
(8)f.write(): 文件不存在,创建文件并写入内容;文件存在,清空原有内容后写入。
(9)f.writeable() : 文件是否可写,返回True/False
with上下文
好处:1.主动关闭文件句柄 2.可以同时打开多个文件句柄,对多个文件进行操作
with open('testfile.txt',encoding='utf-8',mode='r') as f: content = f.read() print(content) #同时打开多个文件句柄 with open('testfile.txt',encoding='utf-8',mode='r')as f1,
open('xxx',encoding='utf',mode='w') as f2: pass
文件的修改方法:
1.以读模式打开原文件,生产一个文件句柄f1
2.以写模式创建一个新文件,生产一个文件句柄f2
3.读取原文件内容进行修改,并写入新文件
4.将原文件删除(os模块的os.remove())
5.将新文件重命名为原文件(os模块的os.rename())