020-python函数和常用模块-文件操作

Python内置函数open,用来打开在磁盘上的文件,并返回一个文件对象,所有对该文件的后续操作都是通过这个"句柄"来进行的。

一、文件操作的三个步骤:

  1. 打开文件;
  2. 操作文件;
  3. 关闭文件。

二、打开文件:

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

原文地址:https://www.cnblogs.com/chhphjcpy/p/6083732.html