文件处理流程:
1, 打开文件, 得到文件句柄并赋值给一个变量
2, 通过句柄对文件进行操作
3, 关闭文件
- # Example 1
- # f = open('a',encoding='utf-8') # 打开文件, 得到文件句柄并赋值给一个变量
- # data = f.read() # 通过句柄对文件进行操作
- # print(data)
- # f.close() # 关闭文件
- ##################### 打开文件的模式 ##################
默认为文本模式, 只能是字符串 (文件没有修改一说, 全是覆盖!!)
r -- 只读模式 [默认模式; 文件必须存在, 不存在则抛出异常]
w -- 只写模式 [不可读; 不存在则创建; 存在则清空内容]
a -- 只追加写模式 [不可读; 不存在则创建; 存在则只追加内容]
x -- 只写模式 [不可读; 不存在则创建; 存在则报错] (不常用, 没什么用)
##################### 打开文件的模式 ##################
对于非文本文件, 我们只能使用 b 模式,"b" 表示以字节的方式操作 (而所有文件也都是以字节的形式存储的,
使用这种模式无需考虑文本文件的字符编码, 图片文件的 jgp 格式, 视频文件的 avi 格式)
rb wb ab
以 b 方式打开时, 读取到的内容是字节类型, 写入时也需要提供字节类型, 不能指定编码
##################### 打开文件的模式 ##################
"+" 表示可以同时读写某个文件
r+, 读写 [可读, 可写]
w+, 写读 [可读, 可写]
a+, 写读 [可读, 可写]
- ##################### 打开文件的模式 ##################
- # 1,r -- 只读模式
- # f = open('a','r',encoding='utf-8') # 默认打开模式就为 r
- # data = f.read() # 读取文件全部, 如果这里读取了, 下面再出现 readline 就没有文件读取了.
- # print(data)
- # print(f.readable()) # 结果: True 判断当前文件是否是 - 只读 (r)
- # print(f.readline()) # 读取文件 第一行 (一次读一行)
- # print(f.readline(),end="") # 读取文件 第二行 并且第二行, 第三行之间没有 另隔一行 换行
- # print(f.readline()) # 读取文件 第三行
- # data = f.readlines() # 将文件所有行, 按列表的形式输出
- # print(data)
- # f.close()
- # 2,w -- 只写模式
- # 写模式 -- 如果文件不存在, 新建一个文件; 如果文件存在, 会把该文件清空 (== 新建一个空文件, 覆盖原文件)
- # f = open('a1','w',encoding='utf-8')
- # f.write("newmet.top == 初相识 01\n")
- # f.write("newmet.top == 初相识 02\n")
- # f.write("new\nmet.top\n 初相识 03\n")
- # print(f.writable()) # 结果: True 判断当前文件是否是 - 只写 (w)
- # f.writelines(['111\n','222\n','333\n'])
- #
- # f.close()
- # 3,a -- 只追加写模式
- # f = open('a1','a',encoding='utf-8')
- # f.write("写到文件最后") # 类似 日志访问记录, 自动追加到文件最后
- # f.close()
- # 4,f.close 可以不写, 利用 with 关键字去只写, 只读文件:
- # 1) 打开一个文件:
- with open('a1','w',encoding='utf-8') as f:
- f.write("newmet.top\n 初相识 \ n")
- # 2) 同时打开两个文件:
- with open('a','r',encoding='utf-8') as src_f, open('a1','w',encoding='utf-8') as dst_f: # 同一行代码太长, 加 \ enter 换行
- data = src_f.read()
- dst_f.write(data)
- ##################### 文件的修改 ##################
- # 1, 文件取出来, 修改
- src_f = open('文件修改','r',encoding='utf-8')
- data1 = src_f.readlines() # 列表
- src_f.close()
- dst_f = open("文件修改 - 01","w",encoding="utf-8")
- # f2.writelines(data1)
- dst_f.write(data1[0])
- dst_f.close()
- # 2, 文件覆盖
- src_f = open('文件修改','r',encoding='utf-8')
- data1 = src_f.readlines() # 列表
- src_f.close()
- dst_f = open("文件修改","w",encoding="utf-8")
- # f2.writelines(data1)
- dst_f.write(data1[0])
- dst_f.close()
- # 上面 1,2 合并在一起:
- with open('文件修改','r',encoding='utf-8') as src_f, open('文件修改 - 01','w',encoding='utf-8') as dst_f: # 同一行代码太长, 加 \ enter 换行
- data = src_f.read()
- dst_f.write(data)
- ##################### b 模式 ##################
- f = open('a1','rb') # b 模式不能指定编码
- data = f.read()
- print(data) # 二进制
- print(data.decode('utf-8')) # 字符串
- f.close()
- f = open('a1','wb') # b 模式不能指定编码
- f.write(bytes('newmet\n',encoding='utf-8')) # 编码
- f.write('初相识'.encode('utf-8')) # 编码
- f.close()
- f = open('a1','ab') # b 模式不能指定编码
- f.write('初相识'.encode('utf-8')) # 编码
- f.close()
- ##################### 文件处理的其他方法 ##################
- f=open('a1','r+',encoding='utf-8')
- f.read() #读取所有内容, 光标移动到文件末尾
- f.readline() #读取一行内容, 光标移动到第二行首部
- f.readlines() #读取每一行内容, 存放于列表中
- print(f.encoding) # 输出 读取时文件使用的编码
- f.flush() # 刷新 保存
- print(f.name) # 打印文件名
- f=open('a1','r+',encoding='utf-8',newline='') # 读取文件中真正的换行符号 (\r\n)
- # 光标的移动
- # 一: read(3):
- # 1. 文件打开方式为文本模式时, 代表读取 3 个字符
- # 2. 文件打开方式为 b 模式时, 代表读取 3 个字节
- # 二: 其余的文件内光标移动都是以字节为单位如 seek,tell,truncate
- print(f.tell()) # 定位光标位置
- f.readline()
- print(f.tell())
- f.seek(10)
- print(f.tell())
- data=f.truncate(10) # 截取从开始一直到第 10 个 部分
- print(data)
- ############ seek 0,1,2 ##########
- # 1,f.seek(3,0)
- # 0 可写可不写, 代表从开头位置算起
- f=open('seek.txt','r',encoding='utf-8')
- print(f.tell()) # 0
- f.seek(10)
- print(f.tell()) # 10
- f.seek(3)
- print(f.tell()) # 3
- # 2,f.seek(3,1)
- # 1 代表相对位置, 从上一次光标所在位置算起
- # 相对位置, 只能是 b 模式, 而且不能有 encoding 编码
- f=open('seek.txt','rb')
- print(f.tell()) # 0
- f.seek(10,1) # 10
- print(f.tell())
- f.seek(3,1)
- print(f.tell()) # 13
- # 3,f.seek(3,2)
- # 2 代表相对位置, 从末尾光标所在位置算起
- # 相对位置, 只能是 b 模式, 而且不能有 encoding 编码
- f=open('seek.txt','rb')
- print(f.tell())
- f.seek(-10,2)
- print(f.read()) # 结果: b'2\r\nnewmet3'
- ############ seek 0,1,2 ##########
- # 看日志最后一行内容:
- # 1, 基础方法:
- f=open('日志文件','rb')
- data=f.readlines()
- print(data[-1].decode('utf-8'))
- # 2,seek 方法:
- # 看日志最后一行内容:
- f=open('日志文件','rb')
- for i in f: # 循环文件的推荐方式 要一行给一行
- offs = -3 # 定义一个偏移量
- while True:
- f.seek(offs,2)
- data=f.readlines()
- if len(data)>1:
- print('最后一行:%s'%(data[-1].decode('utf-8')))
- break
- offs*=2
- # 倒序阅读, 逐渐增加偏移量
来源: http://www.bubuko.com/infodetail-2865442.html