zoukankan      html  css  js  c++  java
  • 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))
    人口普查示例:
  • 相关阅读:
    linux查看CPU和内存信息
    linux yum命令详解
    查看文件中关键字前后几行的内容
    vue.js+web storm安装及第一个vue.js
    android GPS: code should explicitly check to see if permission is available
    ASP.NET MVC Identity 使用自己的SQL Server数据库
    阿里云服务器,tomcat启动,一直卡在At least one JAR was scanned for TLDs yet contained no TLDs就不动了
    ASP.NET MVC4 MVC 当前上下文中不存在名称“Scripts”
    python 将windows字体中的汉字生成图片的方法
    Java android DES+Base64加密解密
  • 原文地址:https://www.cnblogs.com/tangxuecheng/p/11216276.html
Copyright © 2011-2022 走看看