zoukankan      html  css  js  c++  java
  • 20201216-1 文件读与写详解3

    1-1
    f = open("yesterday2",'r',encoding = "utf-8")   # 文件句柄
    print(f.tell())
    --->
    0
    # 打开文件后,看光标的位置
    # tell 打印光标的位置
    1-1-1
    f = open("yesterday2",'r',encoding = "utf-8")   # 文件句柄
    print(f.tell())
    print(f.readline())
    print(f.tell())
    --->
    0
    Yesterday, all my troubles seemed so far away
    
    47
    
    多少个字符,就默认读多少个数
    1-1-2
    可以指定读取个数
    f = open("yesterday2",'r',encoding = "utf-8")   # 文件句柄
    print(f.tell())
    print(f.read(5))
    print(f.tell())
    --->
    0
    Yeste
    5
    
    tell() 是按字符计数的
    1-1-3
    f = 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 stay
    
    122
    1-1-4
    f = 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 stay
    
    122
    Yesterday, all my troubles seemed so far away
    1-1-5
    f = 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 stay
    
    122
     all my troubles seemed so far away
    
    # 以上是 tell 和 seek 函数
    1-2-1
    encoding 打印文件编码
    f = open("yesterday2",'r',encoding = "utf-8")   # 文件句柄
    print(f.encoding)
    --->
    utf-8
    1-2-2
    fileno 返回文件句柄在文件中的编号
    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
    ")
    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-6
    import sys,time
    
    for i in range(50):
        sys.stdout.write("#")
        time.sleep(1)
        # 默认不会换行,从前往后一点点排
    1-2-7
    import sys,time
    
    for i in range(20):
        sys.stdout.write("#")
        # 这是等缓存区满了,统一打出来,所以需要刷新
        sys.stdout.flush()    # 刷新
        time.sleep(0.1)
    
    # 屏幕也被当做一个文件输出,这个stdout.flush() 和前面的 flush 是一样的
    1-2-8
    f.closed()   # 判断文件是否关闭 返回 true 或 false
    
    f.truncate()  # 如果里面什么也不写,文件会被清空
    1-2-9
    f = open("yesterday2",'a',encoding="utf-8")
    f.truncate(10) 
    --->
    Yesterday,
    
    # 'w' 会清空,'w'是创建一个新文件,改成 'a'
    # 从文件开头,开始截断 [指针在开头]
    
    1-2-9
    f = 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
    ")
    f.write("------- Wow -------2
    ")
    f.write("------- Wow -------3
    ")
    f.write("------- Wow -------4
    ")
    
    # 打印位置
    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 -------4
    should 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-3
    f = open("yesterday2",'rb')
    print(f.readline())
    print(f.readline())
    print(f.readline())
    --->
    b'------- Wow -------1
    '
    b'------- Wow -------2
    '
    b'------- Wow -------3
    '
    
    # 结果也是能读的
    # 前面的 b 是 字节类型,表示二进制
    # 
     是 windows 的换行格式
    
    # python3 中 网络传输,只能用 二进制
    # 二进制文件 就用 二进制打开,网络传输,也用二进制
    1-3-4
    # 有 rb 就有 wb
    f = open("yesterday2",'wb')     
    f.write("hello bianry
    ")
    f.close()
    --->
    TypeError: a bytes-like object is required, not 'str'
    
    # 如何将 字符串 转换成 bytes? 用 encode
    1-3-5
    f = open("yesterday2",'wb')     
    f.write("hello bianry
    ".encode())
    f.close()
    # 没有跟字符集,就默认使用程序的字符集
    --->
    hello bianry
    
    # 默认 utf-8
    # 二进制不只是指 0101,是说这个文件是以 二进制编码的;内部的处理是按二进制处理
    # 3.0 上需要明确区分,二进制就是二进制,字符串就是字符串
  • 相关阅读:
    修炼一名程序员的职业水准_转
    system执行shell命令
    (转)MySql数据库索引原理(总结性)
    (转)SQL Server基础之存储过程(清晰使用)
    (转)菜鸟学数据库(三)——存储过程
    (转)菜鸟学数据库(二)——触发器
    (转)SqlServer基础之(触发器)(清晰易懂)
    (转)菜鸟学数据库(一)——三范式
    (转)HTTP 协议详解(基础)
    (转)HTTP协议漫谈
  • 原文地址:https://www.cnblogs.com/azxsdcv/p/14144929.html
Copyright © 2011-2022 走看看