'''文件处理b模式''' # f = open('笑纳', 'rb', encoding='utf-8') # b的方式不能指定编码,字节的形式读取 # f = open('笑纳', 'rb') # data = f.read() # 在win系统中,换行其实是 ;linux系统是 # 字符串--encode-->字节****字节--decode-->字符串 # print(data.decode('utf-8')) # 这个是字节转换成字符串,用decode()函数进行解码 # f.close() # f1 = open('笑纳', 'wb') # b的方式不能指定编码,以字节的形式写入 # f1.write(bytes('你好啊 ', encoding='utf-8')) # bytes()函数是将字符串转换成字节 # f1.write('你好'.encode('utf-8')) # 这个是字符串转换成字节,用encode()函数进行编码 # f1.close() # f2 = open('笑纳', 'ab') # f2.write('这是ab追加模式'.encode('utf-8')) # f2.close() #总结:open()函数默认是读'r'以及文本文件't',所以对于其他类型文件二进制可以处理;二进制可以跨平台;linux系统默认是二进制,所以b模式无效 '''文件操作的其它方法''' # f = open('笑纳', 'r', encoding='utf-8', newline='') # python把win系统的换行自动处理为 ,加上newline=''关键字即可完整显示换行符为 # print(f.closed) # 判断文件是否关闭,关闭则返回True # print(f.encoding) # 取的是文件打开的编码,也就是open()函数里所写的编码,与源文件以何种编码存放到硬盘没有关系 # f.flush() # 刷新文件,文件是读取到内存当中,做更改操作也是存储在内存,使用此方法可以将修改后的文件刷新到硬盘中 # f.name # 文件名 # print(f.readlines()) # print(f.tell()) # 打印光标所处位置,1个中文为3个字节(utf-8);注意:read(3)代表读取3个字符,其余的文件内光标移动都是以字节为单位如seek,tell,truncate # f.readline() # print(f.tell()) # f.seek(2) # 控制光标的移动,以字节为单位;当光标移动到一个字节的字符中间时,此时打印会报错,起始字节错误 # print(f.tell()) # print(f.readline()) # 打印光标所处位置后面的内容 # print(f.read(1)) # 读取几个字符,换行有两个字符 # f = open('笑纳', 'r+', encoding='utf-8') # f.truncate(40) # 截取,属于写操作;把X个字节以内的内容保留,余后的都删除;w和w+除外 '''文件seek方法补充(0,1,2)''' # f = open('笑纳', 'r', encoding='utf-8') # f.seek(10, 0) # 0代表绝对位置,光标从文件开头开始 # print(f.tell()) # f = open('笑纳', 'rb') # f.seek(3, 1) # 从相对位置开始移动光标,也就是上次停留的位置 # print(f.tell()) # f.seek(3, 1) # print(f.tell()) # f = open('笑纳', 'rb') # f.seek(0, 2) # 当第一个参数为非负数时,默认光标在文件末尾,然后再移动X个字符 # print(f.tell()) # f.seek(-7, 2) # 当第一个参数为负数时,表示从文件末尾向前移动X个字符 # print(f.tell()) # print(f.read()) # 循环文件的推荐方式 # f = open('笑纳', 'rb') # for i in f: # print(i) # 如何打印日志文件的最后一行 # 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 # 后面这些打开文件操作都忘记关闭文件了。。。