一 文件操作步骤
1 打开文件, 得到文件的句柄并赋值
2 通过句柄对文件进行操作
3 关闭文件
文件操作的实质是: 读取文件到内存中, 可以在内存中查看, 修改, 复制等操作, 若是对文件进行了重新修改删除等操作, 则是重新写入硬盘中, 并不是在原硬盘文件上操作!
二 文件操作实例
1 读取文件
- f = open('test','r',encoding='utf-8')
- #data = f.read() #读取文件所有的内容
- # print(f.readable()) #查询文件是否可以读取
- # print("第一行",f.readline().rstrip('\n')) #读取文件一行, 去除最后一行的换行标志
- # print("第二行",f.readline().rstrip('\n')) #文件一次读取一行, 没读一次, 光标会记录读取的位置
- # print("第三行",f.readline().rstrip('\n'))
- # print("第四行",f.readline().rstrip('\n'))
- # print("第五行",f.readline().rstrip('\n'))
- # print("第六行",f.readline().rstrip('\n'))# 文件已经读完, 光标移动最后, 所以读不出内容
- # print("第七行",f.readline().rstrip('\n'))
- print(f.readlines())# 读取文件所有的内容, 包含回车键也读出了
- f.close()
如上: 文件读取操作主要有以上函数 readable(): 查询文件是否可以读取 readline(): 读取文件一行, 以换行标志结束 readlines()读取所有的内存, 包含换行, 存放在一个列表中. read()默认读取所有的字符, 若是带参数如 read(10)表示读取 10 个字符
2 写文件操作
- f = open('测试','w',encoding='utf-8')
- print(f.writable())
- f.write('骑驴追车') #写的内容必须是字符串
- f.writelines(['1111111\n','222222\n','扬帆起航'])
- f.close()
如上: write()操作是向文件写入字符串, 写的必须是字符串, writeable()查询文件是否可写, writelines()写入的内容是列表, 列表中内存是字符串元素
3 追加模式操作
- # f = open("测试",'a',encoding='utf-8')
- # f.write('\n 测试追加')
- # f.close()
- f = open("test",'r+',encoding='utf-8') #打开文件, 可以写
- f.write('\n 测试读写') #写的时候 是从光标位置开始写, 第一次打开, 默认从第一行开始写
- f.close()
如上: a 表示在源文件基础上进行写操作.
另外除了'r','w','a'模式外还有'x'模式, x 模式与 w 模式不同之处主要有 x 是写操作源文件不存在, 则报错, 而 w 不存在则创建, 若存在源文件内容都清空.
'r+'模式是以读的方式打开, 可以进行写操作
'w+'模式是写写的方式打开, 可以进行读操作
'a+'模式是以追加的模式打开, 可以进行读操作
'b'模式是表示以二进制的形式进行读写, 如'rb','rb+','wb','wb+'等操作, 默认操作是以文本的形式操作.
winddow 系统主要有文本和二进制 (字节) 的形式操作, 底层的实质是把文本字符串转换为二进制, 而 linux 系统均是以二进制形式操作
二进制操作不用指定编码
f = open('测试','rb')
4 二进制操作
- # f = open('二进制测试','wb')
- # f.write('二进制测试读写操作 \ n'.encode('utf-8')) #通过字符串方法 encode 进行编码操作, 写入到文本中
- # f.write(bytes('字节转换形式操作',encoding='utf-8'))# 通过字符串操作函数 bytes 操作, 以 utf-8 编码写入到文本中, 进行文本操作
- # f.close()
- f = open('二进制测试','rb')
- data = f.read()
- print(data.decode('utf-8')) #读出的数据为二进制编码, 通过方法 decode 进行解码操作, 打印出字符串
- f.close()
二进制操作方式中不能指定编码, 同时注意 window 系统中回车换行为 \ r\n,linux 系统中为 \ n
文本字符串 -----encode-------->二进制编码
二进制编码 -----decode-------->文本字符串
进行二进制编码的方式有:
- '字符串'.encode('utf-8')
- bytes('字符串',encoding='utf-8')
对二进制进行解码的方式有:
'二进制编码'.decode('utf-8')
5 文件其他操作函数总结
read(3)代表读取 3 个字符, 其余的文件内光标移动都是以字节为单位的如 seek,tell,read,truncate 操作
- f.flush()# 把文件内容从内存刷到硬盘中, 起到实时保存的作用.
- f.closed# 文件如果关闭, 则返回 True
- f.encoding# 查看使用 open 打开文件的编码格式, 注意并不是文件的实际编码格式
- f.tell #查看文件处理当前的光标位置
- f.seek(3)# 从头开始运算, 将光标移动到第三个字节
- f.truncate(10)# 从头开始运算, 将文件只保留从 0-10 个字节的内容, 文件必须是以写的方式打开, 但是'w'和'w+'除外.
6 seek 方法的高级应用
seek 共有 2 个参数, 第一个参数为光标个数, 第二个参数默认为 0, 默认为 0 时, 光标个数是从头开始计数的.
当第二个参数为 1 时, 则光标相对从从上一次的位置操作开始.
当第二个参数为 2 时, 则光标倒着开始计数, 例如 f.seek(-5,2)表示从尾向前数 5 个字符开始读取
例, 读取操作日志的最后一行.
- with open('日志','rb') as f:
- for i in f: #读取文件时, 推荐一行一行的读取, 节省内存
- offset = -10
- while True:
- f.seek(offset,2) #从尾开始插入光标
- data = f.readlines() #读出来是一个列表
- if len(data)> 1:
- print(data[-1].decode('utf-8'))
- break
- offset *= 2
来源: http://www.bubuko.com/infodetail-2687311.html