20201216-1 文件读与写详解3

1-1f = open("yesterday2",'r',encoding = "utf-8")   # 文件句柄print(f.tell())--->0# 打开文件后,看光标的位置# tell 打印光标的位置
1-1-1f = open("yesterday2",'r',encoding = "utf-8")   # 文件句柄print(f.tell())print(f.readline())print(f.tell())--->0
Yesterday, all my troubles seemed so far away47多少个字符,就默认读多少个数
1-1-2可以指定读取个数
f = open("yesterday2",'r',encoding = "utf-8")   # 文件句柄print(f.tell())print(f.read(5))print(f.tell())--->0
Yeste5tell() 是按字符计数的
1-1-3f = open("yesterday2",'r',encoding = "utf-8")   # 文件句柄print(f.tell())print(f.readline())print(f.readline())print(f.readline())print(f.tell())--->0
Yesterday, all my troubles seemed so far away

����,���з�������ȥ

Now it looks as though they're here to stay122
1-1-4f = open("yesterday2",'r',encoding = "utf-8")   # 文件句柄print(f.tell())print(f.readline())print(f.readline())print(f.readline())print(f.tell())# 读取三行内容后,想移回光标# seek 是查找光标# 如果想回到第二行,回不去的,除非有记录f.seek(0)print(f.readline())# seek 和 tell 搭配使用--->0
Yesterday, all my troubles seemed so far away

����,���з�������ȥ

Now it looks as though they're here to stay122Yesterday, all my troubles seemed so far away
1-1-5f = open("yesterday2",'r',encoding = "utf-8")   # 文件句柄print(f.tell())print(f.readline())print(f.readline())print(f.readline())print(f.tell())# 读取三行内容后,想移回光标# seek 是查找光标# 如果想回到第二行,回不去的,除非有记录f.seek(10)print(f.readline())--->0
Yesterday, all my troubles seemed so far away

����,���з�������ȥ

Now it looks as though they're here to stay122
 all my troubles seemed so far away# 以上是 tell 和 seek 函数
1-2-1encoding 打印文件编码
f = open("yesterday2",'r',encoding = "utf-8")   # 文件句柄print(f.encoding)--->utf-8
1-2-2fileno 返回文件句柄在文件中的编号
f = open("yesterday2",'r',encoding = "utf-8")   # 文件句柄print(f.fileno())--->
3# 操作系统会有一个专门的接口 负责调动所有文件,读文件不是python自己读的# 而是调用操作系统 io 读取的
1-2-3# name 就是打印文件名字# isatty 查看是否是终端设备,比如和打印机的交互可能会用到# seekable  比如 tty 文件,终端设备文件是移不回去的,比如在 linux 上,一切皆文件# 如果是二进制,字符串是可以移动的,如果可以移动,返回true;否则,返回 false# readable 是否可读,writable 判断是否可写
1-2-4# flush 刷新# 写入文件时,如果刚刚写完一行断电了,这一行,可能就没有写进去# 因为这一行,可能还是在内存的缓存中的# 文件读写有一个缓存的机制,硬盘的读写比内存的读写慢# 会导致瓶颈卡在这里,必须写到硬盘里才可以继续下一行# 为了解决这个问题,没写完一行,暂时存在内存的缓存里,只要达到大小就一次性刷到硬盘上# 所以写的是一行,其实可能是若干行一起写入的# 这时有没有一种可能要求数据的实时一致性?# 要求 百分百确认,写入了就是写入了# 确保缓存里的东西刷到硬盘,所以需要强制刷新# 比如存钱等场景,会用到f = open("yesterday2",'w',encoding="utf-8")     # 文件句柄f.write("hello 1\n")
1-2-5# 打印进度条,就是借助 flush 方法import sys

sys.stdout.write()# sys.stdout 标准输出# sys.stdin  标准输入# write 操作屏幕,往屏幕上面输出东西>>> import sys>>>
>>> sys.stdout.write("#")#1>>> sys.stdout.write("####")####4>>> sys.stdout.write("#######")#######7>>>
1-2-6import sys,timefor i in range(50):
    sys.stdout.write("#")
    time.sleep(1)# 默认不会换行,从前往后一点点排
1-2-7import sys,timefor i in range(20):
    sys.stdout.write("#")# 这是等缓存区满了,统一打出来,所以需要刷新sys.stdout.flush()    # 刷新time.sleep(0.1)# 屏幕也被当做一个文件输出,这个stdout.flush() 和前面的 flush 是一样的
1-2-8f.closed()   # 判断文件是否关闭 返回 true 或 falsef.truncate()  # 如果里面什么也不写,文件会被清空
1-2-9f = open("yesterday2",'a',encoding="utf-8")
f.truncate(10) 
--->Yesterday,# 'w' 会清空,'w'是创建一个新文件,改成 'a'# 从文件开头,开始截断 [指针在开头]1-2-9f = open("yesterday2",'a',encoding="utf-8")
f.seek(10)
f.truncate(20) 
# 移动不好使,无论光标在哪里,都是从头开始截断
2-1# 既能读,又可以写入的方式,r+f = open("yesterday2",'r+',encoding="utf-8")    # 文件句柄# r+ 就是读写,又能读,又能写print(f.readline())print(f.readline())print(f.readline())
f.write("------- Wow -------")print(f.readline())--->结果是 ------- Wow ------- 写在了最后面
1-3# 有读写,就有写读# f = open("yesterday2",'r+',encoding="utf-8") # 文件句柄 读写 # f = open("yesterday2",'w+',encoding="utf-8") # 文件句柄 写读# 区别是,写读是先创建一个文件,然后写入# 先创建文件,写四行f = open("yesterday2",'w+',encoding="utf-8") 
f.write("------- Wow -------1\n")
f.write("------- Wow -------2\n")
f.write("------- Wow -------3\n")
f.write("------- Wow -------4\n")# 打印位置print(f.tell())
f.seek(10)print(f.readline())
f.write("should be at the begining of the second line")--->
------- Wow -------1
------- Wow -------2
------- Wow -------3
------- Wow -------4should be at the begining of the second line# 结果还是追加在后面了,没有办法在中间修改# 写读模式,没有什么用处# 读写模式,可以打开,可以追加
1-3-1# 还有一个追加读# f = open("yesterday2",'a+',encoding="utf-8") 追加读写# 追加默认不能读# f = open("yesterday2",'r+',encoding="utf-8") 用的最多
1-3-2# 还有一种模式# f = open("yesterday2",'rb',encoding="utf-8")  以二进制格式读文件f = open("yesterday2",'rb',encoding="utf-8")print(f.readline())print(f.readline())print(f.readline())# 里面的不是 二进制 那么能够读取吗--->ValueError: binary mode doesn't take an encoding argument# 二进制的模式是不能传 encoding 参数的# 因为是 二进制,所以不需要编码了
1-3-3f = open("yesterday2",'rb')print(f.readline())print(f.readline())print(f.readline())--->b'------- Wow -------1\r\n'b'------- Wow -------2\r\n'b'------- Wow -------3\r\n'# 结果也是能读的# 前面的 b 是 字节类型,表示二进制# \r\n 是 windows 的换行格式# python3 中 网络传输,只能用 二进制# 二进制文件 就用 二进制打开,网络传输,也用二进制
1-3-4# 有 rb 就有 wbf = open("yesterday2",'wb')     
f.write("hello bianry\n")
f.close()--->TypeError: a bytes-like object is required, not 'str'# 如何将 字符串 转换成 bytes? 用 encode
1-3-5f = open("yesterday2",'wb')     
f.write("hello bianry\n".encode())
f.close()# 没有跟字符集,就默认使用程序的字符集--->hello bianry# 默认 utf-8# 二进制不只是指 0101,是说这个文件是以 二进制编码的;内部的处理是按二进制处理# 3.0 上需要明确区分,二进制就是二进制,字符串就是字符串
上一篇:JavaWeb——Filter


下一篇:20201214-4 文件读与写详解2