美文网首页Python全栈工程师
21.3-StringIO和BytesIO和os.path

21.3-StringIO和BytesIO和os.path

作者: BeautifulSoulpy | 来源:发表于2019-10-09 10:35 被阅读0次

    自由从何而来?从自信来,而自信则是从自律来。

    先学会克制自己,用严格的日程表控制生活,才能在这种自律中不断磨练出自信。都是成年人,连最基本的行为控制都做不到,还谈什么自信,又奢谈什么自由?

    Python 中有着非常多“类文件对象”。比如 io 模块内的 StringIO 对象就是其中之一。它是一种基于内存的特殊对象,拥有和文件对象几乎一致的接口设计。

    StringIO

    很多时候,数据读写不一定是文件,也可以在内存中读写。
    StringIO顾名思义就是在内存中读写str, 能缓存则缓存,分批操作可以大大提高程序运行效率;
    要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可:

    from io import StringIO
    from io import BytesIO
    
    # 内存中的一段区域;
    tio = StringIO()
    
    #tio = BytesIO()
    
    tio
    #-----------------
    <_io.StringIO at 0x1a2957e5678>
    
    tio.write('abcde\nxyz')
    tio.readable(),tio.writable(),tio.seekable()
    #--------------------------------------------------------------
    (True, True, True)
    
    tio.seek(0)
    
    tio.read()
    print('-----------------')
    tio.getvalue()
    #-------------------------------------------------
    -----------------
    'abcde\nxyz'
    
    tio.fileno()  # 存在内存中,在硬盘中没有存贮
    UnsupportedOperation: fileno
    
    tio.closed
    #----------------------------
    False
    
    

    总结:

    1. 内存中,StringIO开辟的一个文本模式的buffer, 可以像文件对象一样操作它;
    2. 当close方法被调用的时候,这个buffer会被释放;
    3. getvalue()获取全部内容,跟文件指针没有关系;

    BytesIO

    总结:

    1. 内存中, BytesIO 开辟的一个二进制模式的buffer, 可以像文件对象一样操作它;
    2. 当close方法被调用的时候,这个buffer会被释放;
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    from io import BytesIO
    # BytesIO IO 写入
    f = BytesIO()
    f.write('中文'.encode('utf-8'))
    print(f.getvalue())
    
    # BytesIO IO 读取
    f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87',)
    print(f.read())
    #-----------------------------------------------------------------------------------------------
    b'\xe4\xb8\xad\xe6\x96\x87'
    b'\xe4\xb8\xad\xe6\x96\x87'
    

    file-like Object

    类文件对象,可以像文件对象一样操作;

    file-like Object 是典型的鸭子类型,open方法返回的是包括read()函数的对象,我们将包括read()对象的类统称为file-like Object,所以除了file之外,内存的字节流,网络流,自定义流只要有read()函数都可以成为file-like Object,而不用遵循继承规则。

    from sys import stdout,stderr
    
    f = stdout
    print(type(f))
    f.write('magedu.com')
    #----------------------------------------
    <class 'ipykernel.iostream.OutStream'>
    magedu.com
    

    sys\os 标准输入、输出、错误输出

    os 与sys模块的官方解释如下:

    操作系统:
    该模块提供了使用依赖于操作系统的功能的便携式方法。

    这个模块提供了一种方便的使用操作系统函数的方法。
    系统相关的信息模块 import sys
    sys.stdout标准输出
    sys.stdin标准输入
    sys.stderr错误输出
    sys.stdin.readline() 从标准输入读一行
    sys.stdout.write("a") 屏幕输出a
    sys.exit(exit_code) 退出程序
    sys.modules 是一个dictionary,表示系统中所有可用的module
    sys.platform 得到运行的操作系统环境
    sys.path 是一个list,指明所有查找module,package的路径.

    sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于替换python的运行时环境。

    from sys import stdout,stderr,stdin
    
    f = stdout
    print(str(f))  # stdout.write(str(f)+ '\n')
    f.write('abcde')
    print()
    
    print('123')
    stderr.write('xyz')
    print(stderr)
    
    print(stdin.seekable())
    #---------------------------------------------------------
    <ipykernel.iostream.OutStream object at 0x000001A293EC22E8>
    abcde
    123
    <ipykernel.iostream.OutStream object at 0x000001A293EC26A0>
    True
    xyz
    
    

    os.path(3.4之前)

    路径:Unix路径与Windows路径
    将Unix路径转换成Windows路径:

    os 操作
    os.path.split(path) 将path分割成目录和文件名并以元组返回
    os.path.splittext(path) 将path分割成目录+文件名和文件的后缀,并以元组返回
    os.path.join(path) 用于路径拼接,将多个路径组合后返回
    os.path.dirname(path) 获取当前的目录
    os.path.realpath(_file_) 获取文件所在完整路径
    os.path.abspath('.') 找linux根或盘符win
    os.mkdir(path) 创建一个路径。
    
    from os import path 
    p = path.join('/etc','adv','mmn')
    p
    #------------------------------------
    '/etc\\adv\\mmn'              # win和linux的路径分割符是不一样的;
    
    # 逐级 打印目录名称 ;
    from os import path
    p1 = path.abspath('text.py')
    
    print(p1,path.basename(p1))
    while p1 != path.dirname(p1):
        p1 = path.dirname(p1)
        print(p1,path.basename(p1))
    #--------------------------------------------------
    C:\Users\Administrator\Desktop\mage_edu\21 Python文件IO(二)文件操作\text.py text.py
    C:\Users\Administrator\Desktop\mage_edu\21 Python文件IO(二)文件操作 21 Python文件IO(二)文件操作
    C:\Users\Administrator\Desktop\mage_edu mage_edu
    C:\Users\Administrator\Desktop Desktop
    C:\Users\Administrator Administrator
    C:\Users Users
    C:\ 
    
    

    os模块的system方法

    system方法会创建子进程运行外部程序,方法只返回外部程序的运行结果。这个方法比较适用于外部程序没有输出结果的情况。

    >>> import os
    >>> os.system("echo \"Hello World\"")   # 直接使用os.system调用一个echo命令
    Hello World         ——————> 打印命令结果
    0                   ——————> What's this ? 返回值?
    >>> val = os.system("ls -al | grep \"log\" ")   # 使用val接收返回值
    -rw-r--r--  1 root       root       6030829 Dec 31 15:14 log    ——————> 此时只打印了命令结果
    >>> print val           
    0                   ——————> 注意,此时命令正常运行时,返回值是0
    >>> val = os.system("ls -al | grep \"log1\" ")
    >>> print val       
    256                 ——————> 使用os.system调用一个没有返回结果的命令,返回值为256~
    
    

    笔记 | 如何在Python下调用Linux的Shell命令?

    3.4版本开始

    建议使用pathlib模块,提供Path对象来操作,包括目录和文件;

    相关文章

      网友评论

        本文标题:21.3-StringIO和BytesIO和os.path

        本文链接:https://www.haomeiwen.com/subject/ffdwpctx.html