Python之文件操作 一、文件操作基本流程 二、文件的编码(凡是带b的模式encoding可以省略不写) 三、文件的打开模式 四、文件的操作方法 五、文件的改
计算机系统分为:计算机硬件,操作系统,应用程序三部分。
我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。
有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:
#变量:f1_obj,f1_file,file,file_handle... 文件句柄。 #open Python的内置函数,但是底层调用的windows系统的open功能,#open功能就是操作文件用的。 #windows系统默认的编码方式gbk,linux,macos:utf-8. #流程: 1打开文件,产生文件句柄。 2对文件句柄进行相应的操作。 3,关闭文件。
Python代码
path 文件路径:d:护士空姐学生少妇联系方式.txt
encoding编码方式:utf-8,gbk....
mode 操作方式: 只读,只写,追加,读写,写读.....
路径:绝对路径:从根目录开始一直找到文件。
相对路径:从当前目录开始找到的文件。
#1. 打开文件,得到文件句柄并赋值给一个变量 f=open('a.txt',encoding='utf-8',mode= 'r') #默认打开模式就为r #2. 通过句柄对文件进行操作 data=f.read() #3. 关闭文件 f.close()
二、文件的编码(凡是带b的模式encoding可以省略不写)
f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
#这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。 f=open('a.txt',encoding='utf-8',mode ='r')
三、文件的打开模式
r、rb、r+、r+b;w、wb、w+、w+b;a、ab、a+、a+b模式(注意***代表必须熟练)
#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, 写读【可写,可读】
f1 = open('护士学生空姐班主任.txt', encoding='utf-8') print(f1.read()) f1.close() # 1, f.read() 全部读出来。 # 2, f.read(n) n 是按照字符读取。 # 3, f.readline() 按行读取 # 4, f.readlines() 按行全部读取 # 5, for 循环去读取。 f1 = open('护士学生空姐班主任.txt', encoding='utf-8') for line in f1: print(line) f1.close()
#r+ 读写,先读后写 f1 = open('护士学生空姐班主任.txt', encoding='utf-8', mode='r+') print(f1.read()) f1.write('666') f1.close()
# rb模式 非文字类的文件 ps 非文字的文件的读取写入 f1 = open('11.jpg', mode='rb') content = f1.read() print(content) f1.close() f2 = open('小猪佩奇.jpg', mode='wb') f2.write(content)
#r+b 读写,先读后写 在b模式下 f1 = open('护士学生空姐班主任.txt', mode='r+b') print(f1.read()) f1.write('666'.encode('utf-8')) f1.close()
# w 模式 写模式 # w:没有文件,创建文件写内容。 # w:如果有文件,清空原文件,写入新内容。 f1 = open('log1', encoding='utf-8', mode='w') f1.write('老男孩是最好的培训学校...') f1.close()
#wb b模式下写 f1 = open('log2', mode='wb') f1.write('法国进口分类结果'.encode('utf-8')) f1.close()
#w+ 先写后读 f1 = open('log1', encoding='utf-8', mode='w+') f1.write('老老男孩.....') f1.seek(0) # 调整光标 print(f1.read()) f1.close()
#w+b模式 b模式下先写后读 f1 = open('log1', mode='w+b') f1.write('老老男孩.....'.encode('utf-8')) f1.seek(0) # 调整光标 print(f1.read()) f1.close()
# a:没有文件,创建文件写内容。 # a:有文件,直接在原文件的后面追加新内容。 f1 = open('log3', encoding='utf-8', mode='a') f1.write('barry') f1.close()
# ab模式 b模式下追加 f1 = open('log3', mode='ab') f1.write('barry'.encode('utf-8')) f1.close()
#a+模式 追加可读 f1 = open('log3', encoding='utf-8', mode='a+') f1.write('范德萨急功近利开发工具') f1.seek(0) print(f1.read()) f1.close()
# a+b模式 b模式下追加可读 f1 = open('log3', mode='a+b') f1.write('范德萨急功近利开发工具'.encode('utf-8')) f1.seek(0) print(f1.read()) f1.close()
四、文件的操作方法
1.常用的操作方法
*r read read(n) # r模式:read(n) n 是按照字符读取。 # rb模式:read(n) n 是按照字节读取。 readline() readlines() for循环 最好的
# readable()
# writeable()判断是否可读或者可写 f1 = open('log1', encoding='utf-8') print(f1.readable()) print(f1.writable()) f1 = open('log1', encoding='utf-8',mode='r+') print(f1.readable()) print(f1.writable())
# seek: 按照字节去调整光标 seek有三种移动方式0,1,2,其中1和2必须在b模式下进行, 但无论哪种模式,都是以bytes为单位移动的 f1 = open('log1', encoding='utf-8') f1.seek(3) print(f1.read()) f1.close()
# tell 告诉光标的位置 f1 = open('log1', encoding='utf-8') print(f1.tell()) print(f1.read()) print(f1.tell()) f1.close()
#truncate 对原文件进行截取内容,以字节形式,只能在a模式下使用。 f1 = open('log1', encoding='utf-8', mode='a') f1.truncate(3) f1.close()
#文件操作的另一种写法 with open (path,encoding=,mode=) as 文件句柄 with open('log1', encoding='utf-8') as f1, open('log2',encoding='utf-8', mode='w') as f2: print(f1.read()) f2.write('666')
五、文件的改
步骤:
1,打开原文件 old_file,将原内容读取到内存。
2,创建一个新文件new_file。
3,将原内容通过你改写形成新内容,写入到新文件。
4,将原文件删除。
5,将新文件重命名成原文件。
例题:
有如下文件:
-------
alex是老男孩python发起人,创建人。
alex其实是人妖。
谁说alex是sb?
你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。
----------
将文件中所有的alex都替换成大写的SB。
#方法一,原文件内容不打,可以用此方法,但是此方法还是很low。 import os with open('change', encoding='utf-8') as f1, open('change.bak', encoding='utf-8', mode='w') as f2: old_content = f1.read() new_content = old_content.replace('SB', 'alex') f2.write(new_content) os.remove('change') os.rename('change.bak', 'change')
# 方法2 import os with open('change', encoding='utf-8') as f1, open('change.bak', encoding='utf-8', mode='w') as f2: for line in f1: new_line = line.replace('alex', 'SB') f2.write(new_line) os.remove('change') os.rename('change.bak', 'change')