• 如何设置文件的缓冲?


    需求:
    将文件内容写入到硬件设备时,使用系统调用,这类I/O操作赶时间很长,为了减少I/O操作的次数,文件通常使用缓冲区(有足够多的数据才进行系统调用),文件的缓冲行为,分为全缓冲,行缓冲,无缓冲。
    如何设置python中文件对象的缓冲行为?

    思路:
    1、全缓冲:open函数的buffering设置为大于1的整数n,n为缓冲区的大小
    2、行缓冲:Open函数的buffering设置为1
    3、无缓冲:open函数的buffering设置为0

    代码:

    # 以只写的方式打开一个文件,若不存在这个文件则新建一个文件
    f = open('demo.txt','w')
    # 写入三个字节
    f.write('acb')
    # 用tail -f来监控demo.txt的情况:
    tail -f demo.txt
    # 一个块一般为4096个字节,再写入4093个字节,tailf查看还是没有输出
    f.write('+'*4093)
    # 再写入一个字节,tail -f查看有输出了
    f.write('-')
    
    # 设置全缓冲区的大小
    # 打开一个文件,设置缓冲区的大小为2048
    f = open('demo2.txt','w',buffering=2048)
    # 测试方法同上
    
    # 设置行缓冲,有
    即可以写入
    f = open('demo3.txt','w',buffering=1)
    f.write('abcd') # tailf查看文件没有内容
    f.write('1234') # tailf查看文件没有内容
    f.write('
    ') # tailf查看文件有内容:abcd1234
    f.write('xyz
    ') # tailf查看文件有内容:xyz
    
    # 设置无缓冲
    # python3中文本不支持无缓冲,报错ValueError: can't have unbuffered text I/O
    # python2中可以
    f = open('demo4.txt','w',buffering=0)
    f.write('a') # tailf可以立刻查看到文件中有内容出现
    
    ==========================================================================
    
    >>> f = open('a.bin','wb')
    
    >>> f.write(b'abc')
    3
    
    >>> f.write(b'efg')
    3
    
    >>> import io
    
    >>> io.DEFAULT_BUFFER_SIZE
    8192
    
    >>> f.write(b'+' * (4096-6))
    4090
    
    >>> f.write(b'-')
    1
    
    >>> f.write(b'*' * 4095)
    4095
    
    >>> f.write(b'/')
    1
    
    >>> f2 = open('a.txt','w')
    
    >>> 'a'.encode()
    b'a'
    
    >>> '齐'.encode()  # 汉字对应三个字节
    b'xe9xbdx90'
    
    >>> f2.write('a' * 4095)
    4095
    
    >>> f2.write('bc')
    2
    
    >>> f2.write('+' * 999)
    999
    
    >>> f
    <_io.BufferedWriter name='a.bin'>
    
    >>> f2
    <_io.TextIOWrapper name='a.txt' mode='w' encoding='UTF-8'>  # 文本文件第一层为textio,缓存区的大小为8092
    
    >>> f2.buffer  # 第二层为buffer,缓存区的大小 为4096
    <_io.BufferedWriter name='a.txt'>
    
    >>> f.raw # 第三层为raw,直接对raw写操作,可以直接写入磁盘,不经过缓存区
    <_io.FileIO name='a.bin' mode='wb' closefd=True>
    
    >>> f2.raw
    ---------------------------------------------------------------------------
    AttributeError                            Traceback (most recent call last)
    <ipython-input-149-8eb3a70ad9d7> in <module>
    ----> 1 f2.raw
    
    AttributeError: '_io.TextIOWrapper' object has no attribute 'raw'
    
    >>> f2.buffer.raw
    <_io.FileIO name='a.txt' mode='wb' closefd=True>
    
    >>> f2.write('*' * (8192-5096))
    3096
    
    >>> f2.write('-')
    1
    
    >>> f3 = open('/dev/pts/2','w')  # 这个tty对应的文件是一个行缓冲文件
    
    >>> f3.isatty()
    True
    
    >>> f3.write('abc')
    3
    
    >>> f3.write('cfg')
    3
    
    >>> f3.write('
    ')  # 输入了
    才会写入磁盘
    1
    
    >>> f = open('a.bin','wb',buffering=8192) # 设定全缓冲,缓冲区的大小
    
    >>> f.write(b'+' * 4097)
    4097
    
    >>> f.write(b'-' * 4097)
    4097
    
    >>> f.raw.write(b'abc')
    3
    
    >>> f.raw.write(b'abc')
    3
    
    >>> f = open('a.bin','wb',buffering=0)  # 设定全缓冲不进行缓冲
    
    >>> f = open('a.bin','wb',buffering=0)
    
    >>> f.write(b'abc')
    3
    
    >>> f2 = open('a.txt','w',buffering=1)    # 文件文件设定行缓冲,二进制文件不可以设定行缓冲
    
    >>> f2.write('abc')
    3
    
    >>> f2.write('efg)
      File "<ipython-input-168-bc2a1864731e>", line 1
        f2.write('efg)
                      ^
    SyntaxError: EOL while scanning string literal
    
    
    >>> f2.write('efg')
    3
    
    >>> f2.write('
    ')
    1
    
    >>> 
    
    
  • 相关阅读:
    一篇文章高效定位iframe
    URL与视图函数的映射
    include标签—引用文件路径
    UnitTest单元测试框架解析【实用篇】
    【案例演练】测试器与模板继承
    2招带你快速获取响应头与发送头
    dede网站如何更新地图sitemap.html
    申请微信小程序流程步骤
    phpstudy本地配置--dede织梦网
    stylus样式开发的使用----vue
  • 原文地址:https://www.cnblogs.com/Richardo-M-Q/p/13302259.html
Copyright © 2020-2023  润新知