美文网首页
python文件

python文件

作者: 枫頔 | 来源:发表于2019-07-22 20:05 被阅读0次

    IO在计算机编程中指的是输入和输出。IO编程中,Stream(流)是一个很重要的概念。IO有同步IO和异步IO两种,同步和异步的区别就在于是否等待IO执行的结果。读写文件是常见的IO操作。

    1. 文件

    1.1 打开文件

    open():打开文件,返回一个stream(流对象)

    使用方法:open(file, mode='r', buffering=None, encoding=None, errors=None...............)

    • file:文本文件、二进制字符串、文件路径(使用相对路径或绝对路径表示)
    • mode:打开文件的模式
      • r:读模式打开(默认)
      • w:写入模式打开,先清空文件,不存在则创建文件
      • x:创建新文件,以写入模式打开
      • a:以追加写入模式打开,不存在则创建文件
      • b:二进制模式打开
      • t:文本模式(默认)
      • +:读写模式打开
    • encoding:打开文件使用的编码(与写入文件使用的编码相同才能正常读取)
    1.2 关闭文件
    • close():close()方法用来关闭文件
    • 建议完成操作后总是关闭文件,打开的文件会占用系统资源
    file = open("test.txt")
    # 操作
    file.close()  # 关闭文件
    
    • try----finally方式:
    try:
      file = open("test.txt")
        # 操作
    finally:
      file.close()
    
    • with-----open-----as-------方式:推荐使用,会自动调用close()方法关闭文件
    with open("test.txt") as f:
      # 操作
    
    1.3 读取文件
    • read():一次读取所有内容并返回,适用于文件较小时使用
    • read(size):读取一定数量数据并返回。文本模式下(rt),表示读取指定字符数;二进制模式下(rb),表示读取指定字节数。UTF8编码下,英文字符一个字节,汉字三个字节
    • readline():读取一行并返回
    • readlines():读取所有行并以列表形式返回(包括换行符)
    # 读取文件
    # read():读取所有并返回,一般用于文件较小时读取
    with open("python.txt", "r") as file:
        content = file.read()
        print(content)
    # read(size):文本模式下读取指定字符数返回;二进制模式下表示读取指定字节返回(utf8编码,英文1个字节,汉字3个字节)
    with open("python.txt", "r") as file:
        content = file.read(20)
        print(content)
        
    with open("python.txt", "rb") as file:
        content = file.read(20)
        print(content)
        
    # readline():读取一行并返回
    with open("python.txt", "r") as file:
        line = file.readline()
        print(line)
        
    # readlines():读取所有行包括换行符并以列表形式返回
    with open("python.txt", "r") as file:
        line_list = file.readlines()
        print(line_list)
        
    
    1.4 写入文件
    • write():写入字符串到文件,并返回写入的字符串数量(二进制模式返回写入的字节数)
    # 写入文件:以写入模式(w,a,x,t,b)打开,使用write()方法进行写入,返回添加的字符数(二进制模式返回添加的字节数)
    with open("python.txt", "a") as file:
        add_num = file.write("这是我自己添加的一行!!!")
        print(add_num)
        
    with open("python.txt", "ab") as file:
        add_num = file.write("这是我自己添加的一行!!!".encode("utf-8"))
        print(add_num)
    
    1.5 文件指针
    • tell():返回当前文件指针所在位置(字节数)
    • seek():修改文件指针位置(通过字节偏移量)
    • seek(self, offset: int, whence: int = 0)
      • offset:字节偏移量
      • whence:相对位置(默认为文件开始位置)0 文件开头 1 当前位置 2 文件末尾
    with open("python.txt", "r") as file:
        print(file.tell())  # 起始指针位置
        file.read(20)  # 读取20个字符
        print(file.tell())  # 读取指定字符后指针位置(字节数)
        file.seek(0)  # 移动指针到指定位置(此处为文件开头)
        print(file.tell())  # 手动移动指针后指针位置
    
    1.6 文件迭代
    • 基本概念:

      • 循环:满足条件的情况下,重复执行某段代码
      • 迭代:按照某种顺序访问线性结构中的每一项
      • 遍历:按一定规则访问非线性结构的每一项
      • 递归:一个函数不断调用自身的行为
    • 判断一个对象能否迭代

      from collections import Iterable
      isinstance(obj, Iterable)
      
    • iter():生成一个迭代器,使用next()函数不断获取下一个值

    • 按行迭代:

      # 文件迭代:按行迭代
      with open("python.txt", "r") as file:
          while True:
              line = file.readline()
              print(line)
              if not line:
                  break
      
      with open("python.txt", "r") as file:
          for line in file:
              print(line)
      

    2. StringIO和BytesIO

    2.1 StringIO:在内存中读写str
    from io import StringIO
    
    file = StringIO("hello\n world \n name.")  # 创建StringIO对象并使用字符串进行初始化
    print(file.read())  # 读取StringIO对象的内容
    
    file.write("hello python")
    print(file.getvalue())  # 获取StringIO对象写入后的内容
    
    2.2 BytesIO:读写二进制数据
    from io import BytesIO
    
    file = BytesIO("你好".encode("utf-8"))  # 创建并初始化BytesIO对象
    print(file.read().decode("utf-8"))  # 读取内容并解码
    
    file.write("中国".encode("utf-8"))  # 向BytesIO对象写入内容(二进制,需要编码)
    print(file.getvalue().decode("utf-8"))  # 获取写入后的内容并解码
    

    3. 序列化与反序列化

    把对象的状态信息变成可存储或传输的过程称之为序列化(二进制格式)。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。python使用pickle模块实现数据的简单序列化和反序列化。

    3.1 序列化
    • pickle.dumps(obj):将对象序列化为bytes(此时可用wb格式打开文件并写入)
    • pickle.dump(obj, file):直接序列化并写入文件
    # 序列化与反序列化
    import pickle
    
    # 序列化:将对象状态信息变为可存储或者可传输的过程称为序列化(变为二进制格式)
    mydict = {"name":"fengdi", "age":22, "language":"python"}
    mydict_pickle = pickle.dumps(mydict)  # 序列化为二进制模式,此时可写入文件或进行传输
    print(mydict_pickle)
    
    with open("pickle.txt", "wb") as file:  # 以二进制写入模式打开并写入
        file.write(mydict_pickle)
        
    with open("pickle.txt", "rb") as file:
        content = file.read()
        print(content)
    
    mylist = ["python", "java", 10, 20]  # 直接序列化对象并写入文件
    with open("pickle.txt", "wb") as file:
        pickle.dump(mylist, file)
        
    with open("pickle.txt", "rb") as file:
        content = file.read()
        print(content)
    
    3.2 反序列化
    • pickle.loads(obj):反序列化bytes文件(应先从文件中读取出来)
    • pickle.load(file):直接从文件中读取bytes并反序列化
    # 反序列化
    with open("pickle.txt", "rb") as file:
        content = file.read()  # 二进制模式
        print(pickle.loads(content)) # 从二进制模式反序列化(需要先以二进制模式将内容读取出来)
        
    with open("pickle.txt", "rb") as file:  # 直接从文件中反序列化为对象
        content = pickle.load(file)
        print(content)
    

    4. python和json格式转换

    • json格式是标准格式,与python类型的对应关系:
    python类型 json类型
    dict { }
    list [ ]
    str " "
    int float 1234.56
    True False true false
    None null
    • 转换方法和序列化反序列化类似:
      • json.dumps(obj):将python对象转换为json对象
      • json.dump(obj, file):将python对象转换为json对象并写入文件
      • json.loads(obj):将json对象转换为python对象 (应先从文件中读取出来)
      • json.load(file):直接从文件中读取并转换为python类型

    相关文章

      网友评论

          本文标题:python文件

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