python之旅基础——文件处理
一、概述
1、对于计算机来说,想要永久保存一个数据,就需要以文件的形式存储在硬盘。存储在硬盘上的数据都是以二进制形式存放,所以,在写入和读取的时候需要注意编码。
2、二进制数据解码成字符串(decode),字符串编码成二进制数据(encode)。
3、文件处理的流程:
①打开文件,得到文件句柄,并赋值给一个变量(从硬盘中加载文件内容到内存);
②通过句柄对文件进行操作;
③关闭文件。
4、文件修改的流程:(计算机无法直接修改原文件中的内容)
①打开源文件,读取文件中的数据;
②以写模式打开一个新的文件,将修改好的文件内容写入这个新文件中;
③将新文件名修改成源文件名,在硬盘上覆盖源文件。
5、在Python中,打开文件可以是以b的模式打开,如rb以二进制读的模式打开文件;wb以二进制写的模式打开文件。注意的是:以二进制打开文件时,无需考虑encoding参数。
有这样模式的意义在于:①文件包含视频文件或图片文件,它们都是以二进制的方式存放在硬盘上的,读取的时候也不会有编码,所以要以二进制的模式打开
②二进制文件跨平台效果好
6、打开文件使用open(filename, mode="rt", encoding=None)内置函数。
默认以“rt”模式打开文件(只读,txt文件)。编码encoding默认跟随操作系统的编码。
二、文件的读操作
f = open("日志文件", "r", encoding="utf-8") #按只读的模式打开文件 date = f.read() #由光标处开始,读取剩下的全部内容 date = f.read(n) #由光标处开始,读取接下来的n个字符内容 date1 = f.readline() #由光标处开始,读取一行的内容(即遇到\n停止) date2 = f.readlines() #由光标出开始,按行读取剩下的全部内容,并将每行的内容作为一个元素放入列表中 f.readable() #判断文件内容是否可读
注:关于文件的操作,只有read()是以字符为单位进行操作,后面所讲的所有对文件的操作,都是以字节为单位进行操作。
f = open("日志文件", "rb") #按二进制只读模式打开文件 date = f.read() #由光标处开始,读取剩下的全部内容,此时读取到的数据都是二进制字节 print(date.decode("utf-8")) #想要打印date数据,且有可阅读性,需要将二进制字节解码成字符串
三、文件的写操作
f = open("new_file", "w", encoding="utf-8") #按只写的模式打开文件,如果文件名不存在,则创建文件;如果文件名存在,操作文件时,文件内容将会被覆盖 f.write("我爱党和祖国") #以字符串的形式,写入文件 f.writelines("1\n2\n3") f.writelines(["123", "456"]) #writelines(iterable),以可迭代对象的形式写入文件 f.writable() #判断文件是否可写 f.close() #关闭并保存文件
f = open("new_test", "wb") #按二进制写的模式打开文件 f.write("i love u".encode("utf-8")) #写入文件内容必须是二进制字节类型,所以需要将写入的字符串编码成二进制 f.close()
四、文件的追加操作
f = open("new_test2", "a", encoding="utf-8") #按追加的模式打开文件,如果文件名不存在,则创建文件;如果文件名存在,操作文件时,文件内容将会追加在文件末尾 f.write("我爱你") f.close()
五、+模式操作
r+:表示文件已读写的模式打开
如a模式不同是,向文件内容添加信息的时候,r+模式是在光标处添加覆盖内容。
六、光标操作
文件内容的读取和写入,都是从根据光标所在的位置进行操作的。
1、f.tell()
返回目前光标所在的位置。
2、f.seek(n, mode=0)
移动光标。n是指光标所移动的字节数。
mode是指移动光标的模式:①0:默认光标初始位置在文件开始
②1:表示光标在上一次光标停留的位置
③2:表示光标初始位置在文件末尾
f = open("日志文件", "r", encoding="utf-8") f.seek(10) #默认从文件开头,向后移动光标10个字节 print(f.tell()) #此时返回10 f.seek(11) #默认从文件开头,向后移动光标11个字节 print(f.tell()) #此时返回11 f.seek(3,1) #从上一次光标停留的地方开始,向后移动光标3个字节 print(f.tell()) #此时返回14 f.seek(-10,2) #从文件末尾,向前移动光标10个字节。注意:n为负数
从文件末尾向后移动光标,最终读取文件最后几行内容。可以用于读取最后几行日志文件。
f = open("日志文件", "rb") #读取日志文件 offs = -10 #预估seek的偏移数 while True: f.seek(offs, 2) #从文件末尾,移动光标offs个字节 date = f.readlines() #按行读取剩下的所有内容 if len(date) > 1: print(date[-1].decode("utf-8")) #如果行数大于1,可以截取最后一行的内容返回 break else: offs *= 2 #如果行数<=1,那么表明可能没有获取完全最后一行的内容
七、其他
1、f.flush()
在没有f.close()的状态下,运行f.flush(),将内存中的数据保存到硬盘文件中。
2、f.truncate(n)
以r+/a+模式打开文件,截取前n个字节的内容读取。(由于w模式是覆盖,所以一旦使用w模式打开,truncate()后得到结果是空)
优质内容筛选与推荐>>