Python内置函数open,用来打开在磁盘上的文件,并返回一个文件对象,所有对该文件的后续操作都是通过这个"句柄"来进行的。
一、文件操作的三个步骤:
- 打开文件;
- 操作文件;
- 关闭文件。
二、打开文件:
1 文件句柄 = open('文件路径', '模式')
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。
打开文件的基本模式:
- r ,只读模式【默认】
- w,只写模式【不可读;不存在则创建;存在则清空内容;】
- x, 只写模式【不可读;不存在则创建,存在则报错】
- a, 追加模式【可读; 不存在则创建;存在则只追加内容;】
1 f = open('db', 'r') # 只读,默认 2 f = open('db', 'w') # 只写,先清空原文件 3 f = open('db', 'x') # 文件存在,报错;不存在,创建并只写;python3中才出现的。 4 f = open('db', 'a') # 追加
1 f = open("db","r",encoding="utf-8") # 当文件打开出现乱码时,一般需要关注编码方式 2 data = f.read() # 默认读出为字符串str类型 3 print(data,type(data)) 4 5 #输出 6 admin|123 7 222|222 <class 'str'>
1 f = open("db","a",encoding="utf-8") 2 f.write("李杰") 3 f.close()
1 f = open('db','rb') #b表示以字节方式操作,二进制方式读取文件,不用设置编码类型。 2 data = f.read() 3 print(data,type(data)) 4 5 # 输出为字节类型 6 b'admin|123 222|222xe6x9dx8exe6x9dxb0' <class 'bytes'> 7 8 f = open("db", 'ab') # 以字节方式追加 9 f.write(bytes("王五", encoding="utf-8")) # 需要字节类型写入 10 f.close() 11 12 #文件内容 13 admin|123 14 222|222李杰王五 15 16 f = open("db", 'ab') 17 f.write("王五") # 错误示例 18 f.close() 19 20 #输出 21 略 22 TypeError: a bytes-like object is required, not 'str'
"+" 表示可以同时读写某个文件
- r+, 读写【可读,可写】,该模式为最常用的模式。
- w+,写读【可读,可写】,先清除文件内容,然后可以写读操作,不常用。
- x+ ,写读【可读,可写】,与w+类似,不常用。
- a+, 写读【可读,可写】,不管指针指向何处,最终都是在文件末尾追加,不常用。
"b"表示以字节的方式操作
- rb 或 r+b
- wb 或 w+b
- xb 或 w+b
- ab 或 a+b
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型
1 f = open("db","r+",encoding="utf-8") #读写模式,该模式为最常用的模式 2 data = f.read() # 指针移到最后 3 # print(f.tell()) 4 f.write("大刀") #在指针后进行数据写入,覆盖模式 5 f.close() 6 7 #文件内容 8 admin|123 9 222|222李杰王五大刀 10 11 12 f = open("db","r+",encoding="utf-8") 13 # 如果打开模式无 b,则read,按照字符读取;有b,则read按照字节读取。 14 data = f.read(1) 15 # tell当前指针所在的位置(字节) 16 print(f.tell()) 17 # 调整当前指针的位置(字节) 18 f.seek(1) 19 # 当前指针位置开始向后覆盖 20 f.write("7777") 21 f.close() 22 23 #程序输出 24 3 # f.read(1)按字符读取,第一个字符为“李”,因此当前指针在3的位置 25 26 #文件内容 27 �7777min|123 # f.seek(1)后,指针位置调整为1,使得“李”这个字符的三个字节被分割,最终导致乱码 28 222|222李杰王五
三、操作文件:
# read() # 无参数,读全部;有参数, # open方式有b,按字节 # open方式无b,按字符 # tell() 获取当前指针位置(字节) # seek(1) 指针跳转到指定位置(字节) # write() 写数据,open方式有b,字节方式写入; open方式无b,字符方式写入。 # close # flush 强刷 # truncate 截断,指针为后的清空 # readline 仅读取一行
关于flush:
一般的文件流操作都包含缓冲机制,write方法并不直接将数据写入文件,而是先写入内存中特定的缓冲区。
flush方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区。
正常情况下缓冲区满时,操作系统会自动将缓冲数据写入到文件中。
至于close方法,原理是内部先调用flush方法来刷新缓冲区,再执行关闭操作,这样即使缓冲区数据未满也能保证数据的完整性。
如果进程意外退出或正常退出时而未执行文件的close方法,缓冲区中的内容将会丢失。
1 # for循环文件对象 f = open(xxx) 2 for line in f: 3 print(line)
四、关闭文件:
1 # 方法一: 2 f.close() 3 4 # 方法二: 5 with open('xb') as f: 6 pass
如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
在Python 2.7 及以后,with又支持同时对多个文件的上下文进行管理,即:
1 with open('log1') as obj1, open('log2') as obj2: 2 pass
五:额外
实现:从文件db1中获取每行信息,并逐行写入到文件db2中,第10行之后自动退出。
1 with open("db1","r",encoding="utf-8") as r,open("db2","w",encoding="utf-8") as w: 2 times = 0 3 for line in r: 4 times += 1 5 if times <= 10: 6 w.write(line) 7 else: 8 break
实现:对每行中包含特定字符串的,进行替换。
1 with open("db1","r",encoding="utf-8") as r,open("db2","w",encoding="utf-8") as w: 2 for line in r: 3 new_line = line.replace("111","vxvx") 4 w.write(new_line) 5 6 #db1文件 7 111111 8 22222 9 33333 10 11 #db2文件 12 vxvxvxvx 13 22222 14 33333
http://www.cnblogs.com/wupeiqi/articles/4950799.html