• 05_Python的文件操作


    1.文件操作概述

        # 文件是用于数据存储的单位通常用来长期存储设置,文件中的数据是以字节为单位进行顺序存储的
        1.打开文件: f = open("xxx") 或 with open("xxx") as f: pass
        2.读写文件: 读(f.read),写(f.write)
        3.关闭文件: f.close()

    2.文件的打开函数 open

        # 用于打开一个文件,打开成功返回文件流对象(文件句柄),如果打开失败会出发IOError异常
        # 打开文件不指定encoding参数时默认以当前平台的编码打开
        f = open(file, mode='rt', encoding='utf-8')

    3.文件的打开方式

        r:
            默认模式,以只读方式打开文件,文件不可写,打开的文件不存在会报错
            文件的指针会放在文件的开头
        rb:
            默认模式,以二进制格式以只读方式打开一个文件,文件不可写,打开的文件不存在会报错
            文件的指针会放在文件的开头
        r+:
            以读写的方式打开文件,写入内容为str类型,打开的文件不存在会报错
            文件的指针会放在文件的开头,重新写入的内容从头开始替换
        rb+:
            以二进制格式的读写方式打开一个文件,可写入内容为bytes类型,打开的文件不存在会报错
            文件的指针会放在文件的开头,重新写入的内容从头开始替换
        w:
            以只写的方式打开文件,写入内容为str类型,文件不可读
            如果文件已存在则将其覆盖,原文件内容清空,文件不存在则创建新的文件
        wb:
            以二进制格式的只写方式打开一个文件,写入内容为bytes类型,文件不可读
            如果文件已存在则将其覆盖,原文件内容清空,文件不存在则创建新的文件
        w+:
            以读写的方式打开文件,写入内容为str类型
            如果文件已存在则将其覆盖,原文件内容清空,文件不存在则创建新的文件
        wb+:
            以二进制格式的写读方式打开一个文件,写入内容为bytes类型
            如果文件已存在则将其覆盖,原文件内容清空,文件不存在则创建新的文件
        a:
            以追加(只写)的方式打开一个文件,写入内容为str类型
            如果文件已存在文件指针将会放在文件的结尾,新的内容将会写入到已有内容,文件不存在则创建新的文件
        ab:
            以二进制格式的追加(只写)方式打开一个文件,写入内容为bytes类型
            如果文件已存在文件指针将会放在文件的结尾,新的内容将会写入到已有内容,文件不存在则创建新的文件
        a+:
            以追加(读写)的方式打开一个文件,写入内容为str类型
            如果文件已存在文件指针将会放在文件的结尾,新的内容将会写入到已有内容,文件不存在则创建新的文件
        ab+:
            以二进制格式的追加(读写)的方式打开一个文件,写入内容为bytes类型
            如果文件已存在文件指针将会放在文件的结尾,新的内容将会写入到已有内容,文件不存在则创建新的文件

    4.文件的关闭方法

        f.close()  # 关闭文件操作符,释放系统资源
        # 用上下文管理器打开的文件无需关闭,因为上下文管理器内容实现了关闭文件的方法
        with open("文件路径", mode="rt", encoding="utf-8") as f:
            pass

    5.文件操作的两种类型(文本文件/二进制文件)

        1.文本文件操作打开模式: 't'
            1.默认文件中存储的内容为字符串数据,以行为单位读取采用系统的换行符进行分隔,对于文本文件需要用字符串(str)进行读取和写入数据
            2.各种操作系统默认的换行符:
                Linux换行符: ' '
                Windows换行符: ' '
                旧的Macintosh换行符: ' '
                新的Mac OS换行符: ' '
        2.二进制文件操作打开模式: 'b'
            1.默认文件中存储都是以字节为单位的二进制数据,需要以字节为单位进行读取,二进制文件的读写需要用字节串进行读写
            2.二进制文件读操作
                f.read(n)  # 返回字节串,n代表最大字节数
                f.readline()  # 返回一行字节串
                f.readlines()  # 返回字节串列表
            3.二进制文件写操作
                f.write(x)  # 写入内容x为字节串
                f.seek(offset, whence=0)
                    offset偏移量: 大于0的数代表向文件末尾移动,小于0代表向文件头方向移动
                    whence相对位置
                        0: 代表从文件头开始偏移
                        1: 代表从当前位置开始偏移
                        2: 代表从文件尾开始偏移,从尾部偏移时offset参数必须为负数
            4.示例:
            f = open("./测试文本/README", mode="rb")  # 以二进制的方式打开只读文件时不能指定编码
            data = f.read()
            # "字节串"--->encode--->bytes
            # bytes--->decode--->"字节串"
            print(data)
            print(data.decode("utf-8"))
            f.close()

            f = open("./测试文本/README", mode="wb")  # 以二进制的方式打开只写文件时不能指定编码
            f.write(bytes("abc ", encoding="utf-8"))
            f.write("你好".encode("utf-8"))
            f.close()

    6.文件操作-读(read, readable, readline, readlines)

        read(n): 读取文件内容,参数n代表读取最大字符数(b模式下为字节数),不写参数表示读取所有内容
        readable: 判断文件是否可读,可读返回True,否则返回False
        readline: 读取一行内容
        readlines: 读取所有文件内容保存到列表,包含不显示的字符
        示例:
            # encoding指定以什么编码来读取文件内容
            # r:以只读方式打开文件,w:以只写方式打开文件,a:以追加方式打开文件,默认以rt方式打开文件
            f = open("./测试文本/README", encoding="utf-8")
            print(f.readable())  # 判断文件是否可读
            print(f.readline())  # 读取一行内容,每次读取出来的数据都会有一个
            print(f.readlines())  # 读取所有文件内容保存到列表,包含不显示的字符
            f.close()  # 关闭文件句柄

    7.文件操作-写(write, writable, writelines, flush)

        write: 写入所有内容
        writable: 判断文件是否可写,可写返回True,否则返回False
        writelines: 以列表内容写,列表元素为字符串
        flush: 刷新缓存
        示例:
            f = open("./测试文本/README", mode="w", encoding="utf-8")
            f.write("hello world!")  # 写入所有内容
            print(f.writable())  # 判断文件是否可写
            f.writelines(["11 ", "22"])  # 以列表内容写,列表元素必须是字符串
            f.flush()  # 刷新缓存
            f.close()

    8.文件操作-操作完成自动关闭文件

        with open("./测试文本/README", encoding="utf-8") as f:
            msg = f.read()
            print(msg)

    9.文件操作-复制

        # 1.打开文件
        file_read = open("./测试文本/README")
        file_write = open("./测试文本/README[复件]", mode="w")
        # 2.读写文件
        while True:
            # 读取一行内容
            test = file_read.readline()
            # 判断是否读到内容
            if not test:
                break
            file_write.write(test)
        # 3.关闭文件
        file_read.close()
        file_write.close()

    10.文件的其他操作

        f = open("./测试文本/test1", mode="w", newline=" ")  # 指定newline读取文件时的换行符
        print(f.closed)  # 判断文件是否关闭
        print(f.encoding)  # 查看文件的编码
        f.flush()  # 将写在内存中的数据刷到文件中保存
        print(f.tell())  # 显示光标所在的位置,光标的移动以字节为单位
        f.seek(0)  # 将光标移动到第0个位置,光标的移动以字节为单位
        f.seek(3, 0)  # 第二个参数表示从哪个位置开始偏移默认时0表示从0位置开始;1:相对位置;2:倒叙,倒叙时第一个参数为负数
        f.truncate(pos = None)  # 剪掉自pos位置之后的数据,返回新的文件长度(字节为单位)
        f.tall()  # 返回当前文件流的绝对位置
        f.seekable()  # 返回这个文件对象是否支持随机定位
        示例:
            # r+模式默认情况下光标在开头,若要保留文件原本类容必须先读后写,若文件不存在则报错
            f = open("./测试文本/test2", mode="r+", encoding="utf-8")
            s = f1.read()
            f.write("111")
            f.flush()
            f.close()

            # w+操作会清空原来的内容,可读可写,若文件不存在则创建文件
            f = open("./测试文本/test3", mode="w+", encoding="utf-8")
            f.write("222")
            f.flush()
            f.seek(0)
            s = f.read()
            print(s)
            f.close()

    11.文件操作-读日志文件

    '''./测试文本/日志文件
        2019年3月17日: 11111
        2019年3月18日: 22222
        2019年3月19日: 33333
        2019年3月20日: 44444
        2019年3月21日: 55555
    '''
    f = open("./测试文本/日志文件", mode="rb")
    for i in f:
        offs = -5
        while True:
            f.seek(offs, 2)  # 将文件光标移动到-5位置
            data = f.readlines()  # 读取所有文件内容保存到列表
            # 判断是否有完整的一行
            if len(data) > 1:
                print("文件的最后一行是:%s" % data[-1].decode("utf-8"))
                break
            offs *= 2
    f.close()
    读日志文件:

    12.文件操作-人口普查示例

    '''./测试文本/人口普查
        {"name": "北京", "population": 5000}
        {"name": "上海", "population": 10000}
        {"name": "广州", "population": 40000}
        {"name": "成都", "population": 15000}
        {"name": "香港", "population": 30000}
    '''
    # 要求: 取人口总数
    def get_population():
        with open("./测试文本/人口普查", mode="r", encoding="utf-8") as f:
            for i in f:
                yield i
    
    
    p1 = get_population()
    g1 = get_population()
    # 取单个市人口数
    # s1 = eval(g1.__next__())["population"]
    # print(s1)
    
    # for循环遍历人口-->不推荐使用,大数据时效率低,内存占用高
    # for p in g1:
    #     p_dic = eval(p)
    #     print(p_dic["population"])
    
    # 生成器原理获取总人口数-->推荐使用表达式,大数据时效率高,内存占用小
    all_pop = sum(eval(j)["population"] for j in g1)
    print("人口总数:%s" % all_pop)
    
    # 生成器原理获取指定城市人口数的占比
    def zyl_pop(name):
        p1_pop = (eval(j)["population"] for j in p1 if eval(j)["name"] == name)
        return p1_pop.__next__() / all_pop
    
    
    name = "上海"
    s2 = zyl_pop(name)
    print("%s的人口占全国人口的%.4f%%" % (name, s2*100))
    人口普查示例:
  • 相关阅读:
    USACO 之 Section 2.2 (已解决)
    USACO 之 Section 2.1 (已解决)
    《C++ Primer》学习 之 函数指针相关用法
    《C++ Primer》学习 之 const_cast使用
    《C++ Primer》学习 之 返回数组的引用(返回数组的指针,方法与之相同)
    USACO 之 Section 1.5 (已解决)
    USACO 之 Section 1.4 More Search Techniques (已解决)
    [NN] 对于BackPropagation(BP, 误差反向传播)的一些理解
    [CLPR] 定位算法探幽
    [LeetCode系列] 双单链表共同节点搜索问题
  • 原文地址:https://www.cnblogs.com/tangxuecheng/p/11216276.html
Copyright © 2020-2023  润新知