• 5、python中的文件操作



    文件操作介绍

    文件的作用:数据的持久化存储
    一个程序在运行过程中用了九牛二虎之力终于计算出了结果,试想一下如果不把这些数据存放起来,那么重启电脑之后,这些数据就都丢失了。这是因为默认数据是加载到内存中,结果也是保存到内存中,程序执行结束,所有的数据都将释放。

    新建文件:
    在这里插入图片描述

    文件的打开操作open()

    编写python文件(文件操作.py)

    #打开文件,相对路径
    f = open('doc/test.txt') #文件打开之后,将其存储为一个文件对象
    #文件的读写操作
    print(f.read())
    #关闭文件
    f.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述open()默认 mode=r,只有读权限

    open()函数设置 mode=w,具有写权限,但是会先将文件原内容清空,然后再写进去

    #打开文件,相对路径
    f = open('doc/test.txt',mode='w') #文件打开之后,将其存储为一个文件对象
    #文件的读写操作
    f.write('java\n')
    #关闭文件
    f.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    但是如果不想清空文件原内容,可以使用open()函数的追加模式,mode='a'

    #打开文件,相对路径
    f = open('doc/test.txt',mode='a') #文件打开之后,将其存储为一个文件对象
    #文件的读写操作
    f.write('linux\nlinux')
    #关闭文件
    f.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    open函数的模式,看下图:
    在这里插入图片描述

    文件的关闭操作

    • 调用 close() 方法关闭文件。文件使用之后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的
    • python中引入了with语句,能自动调用 close() 方法

    python中的with语句适用于对资源进行访问的场合,保证不管处理过程中是否发生错误或异常都会自动执行规定的 “清理” 操作,释放被访问的资源,比如文件读写后自动关闭,线程中锁的自动获取或释放等。

    #doc/hello.txt是不存在的文件,对其写入
    with open('doc/hello.txt','w+') as f:  #将打开的文件对象赋值给f
        f.write('hello world\n')
        print(f.read())  
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    上述程序语句 print(f.read()) 不会输出,因为在doc/hello.txt文件写入内容之后,指针是指向内容末尾,没东西能读。如果要读取文件内容,需要将指针移向文件最开始的位置。

    seek(offset ,from) :offset表示偏移量,from表示方向
    0:表示文件开头
    1:表示当前位置
    2:表示文件末尾
    把位置设置成文件最开始:seek(0,0)
    把位置设置成文件最末尾:seek(0,2)

    # doc/hello.txt是不存在的文件,对其写入
    with open('doc/hello.txt', 'w+') as f:  # 将打开的文件对象赋值给f
        f.write('hello world\n')
        f.seek(0, 0) #将指针移动到开头位置
        print('当前指针位置:', f.tell()) #打印指针位置
        print(f.read())
        f.seek(0, 2) #将指针移动到末尾位置
        print('当前指针位置:', f.tell()) #打印指针位置
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    练习:词频统计操作

    技能需求:
    1. 文件操作
    2. 字符串的分割操作
    3. 字典操作
    功能需求:词频统计
    1. 读取song.txt文件
    2. 分析文件中的每一个单词,统计每个单词出现的次数。{“hello”:2, “python”:1, “java”:1}

    split()函数默认以空格为分隔符

    d = {}
    with open('doc/song.txt') as f:
        content = f.read()
    words = content.split()
    # print(words)
    for item in words:
        if item not in d:
            d[item] = 1
        else:
            d[item] +=1
    #print(d)
    import pprint
    pprint.pprint(d)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    使用pprint模块打印,显示更友好
    在这里插入图片描述

    拓展:counter模块,可以用于统计和排序

    with open('doc/song.txt') as f:
        content = f.read()
    words = content.split()
    
    from collections import Counter
    count= Counter(words)
    result=count.most_common(5)
    print(result)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述count.most_common(5)用于获取出现次数最多的5个

    os模块

    是管理操作系统的一些方法

    os,语义为操作系统,处理操作系统相关的功能,可跨平台。

    关于操作系统

    import os
    import platform
    
    print(os.name)  # 1、获取操作系统类型,nt是指Windows操作系统
    # 2、获取主机信息,
    #Linux系统使用os模块,Windows使用platform模块
    # 不能的平台需要使用不同的代码,如何实现代码的跨平台?
    try:  # 可能报错的代码
        uname = os.uname()
    except Exception:  # 出现异常执行的代码
        uname = platform.uname()
    finally:  # 不管是否有异常,都会执行的代码
        print(uname)
    
    # 3、获取系统的环境变量
    envs = os.environ
    print(envs)
    
    # 4、通过key值,获取系统变量对应的value值
    print(os.environ.get('PATH'))
    print(os.getenv('PATH'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    关于路径

    import os
    
    # 判断是否为绝对路径
    print(os.path.isabs('/tmp/abc')) #True
    print(os.path.isabs('abc')) # false
    
    # 生成绝对路径
    print(os.path.abspath('/tmp/abc'))
    print(os.path.abspath('zbc.txt'))
    
    #文件名和目录名的拼接,join拼接
    #os.path.dirname()获取某个文件对应的目录名
    #  _ _file_ _ 表示当前文件
    base_dir=os.path.dirname(_ _file_ _) #获取当前目录名
    #setting_file1=base_dir + '/' + 'abc.txt' #拼接方法一,不建议
    #print(setting_file1)
    setting_file2=os.path.join(base_dir,'dev.conf')  #拼接方法二,建议
    print(setting_file2)
    
    #获取当前文件名、目录名
    print(os.path.basename(_ _file_ _))  
    print(os.path.dirname(_ _file_ _))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述
    另外,还有rename()可以完成对文件的重命名操作。os模块中的remove()可以完成对文件的删除操作

    • rename(需要修改的文件名,新的文件名)

    • remove(待删除的文件名)

    • os.mknod(‘abc.txt’) ,Linux下创建文件,Windows下创建文件可以按照如下方式
      with open(‘doc/hello.txt’,‘w+’) as f:
      pass

    • os.exists(‘abc.txt’) 判断文件或目录是否存在

    • os.path.splitext(‘hello.txt’) 将文件名和后缀名分隔开

    • os.path.split(‘hello.txt’) 将文件名和后缀名分隔开

    • os.path.split(‘/tmp/hello/hello.txt’) 将文件名和目录名分隔开

    json模块

    json(javascript object notation) 是一种轻量级的数据交换格式。
    可能一个项目是由多种语言编写的,比如 c 、python、Java等等,那么怎么把C语言得到的结果传递给python呢?然后python对得到的数据进一步操作呢?

    json采用完全独立于语言的文本格式,是一种理想的数据交换语言。易于人们阅读和编写,同时也易于机器解析和生成。(一般用于提升网络传输效率)

    python中的集合不能转换成json格式

    具体实现:
    在这里插入图片描述

    dump() 表示存储到某一个文件中去,如果不需要存储到文件就使用 dumps()

    将python对象编码成json字符串

    • json.dumps()将python中字典类型的数据转成json字符串
    • json.dump()将python中的字典数据类型转换为json字符串,并写入文件中
    # 将python对象编码成json字符串
    import json
    
    users = {"name": "lee", "age": 18, "city": "上海"}
    json_str = json.dumps(users)  #不存储到文件中
    print(json_str,type(json_str)) #字符串类型
    
    #将python对象编码成json字符串,并保存到文件中
    with open('doc/save_json.json','w') as f:
        json.dump(users,f)
        print("存储成功")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述在这里插入图片描述
    但是保存到文件中之后,中文看不懂,

    序列化和反序列化常用参数

    json.dumps()函数有一些常用参数:

    json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
    allow_nan=True, cls=None, indent=None, separators=None,
    encoding=“utf-8”, default=None, sort_keys=False, **kw)

    • ensure_ascii=false , 则设定了中文存储
    • indent=4 , 设定缩进为4个空格,增强可读性,但是缩进空格会使数据变大
    • separators(‘,’,‘:’) , 自定义分隔符,元素间分隔符为逗号,字典key和value的分隔符为冒号
    • sort_keys=True , 字典排序
    # 将python对象编码成json字符串
    import json
    
    users = {"name": "lee", "age": 18, "city": "上海"}
    json_str = json.dumps(users)  #不存储到文件中
    print(json_str,type(json_str))
    #将python对象编码成json字符串,并保存到文件中
    with open('doc/save_json.json','w') as f:
        json.dump(users,f,ensure_ascii=False,indent=4)
        print("存储成功")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    将json字符串解码为python对象

    • json.load()操作的是文件流,把json格式字符串转化为python中的字典,读取的是文件
    • json.loads()操作的是字符串,把json格式字符串转换为python中的字典

    json文件:
    在这里插入图片描述

    import  json
    with open('doc/save_json.json') as f: #只读方式打开json文件
        py_obj=json.load(f)
        print(py_obj,type(py_obj))
    
    • 1
    • 2
    • 3
    • 4

    运行结果:
    在这里插入图片描述

    存储为excel文件

    import pandas 出现错误,未安装pandas,
    打开terminal,pip install pandas -i https://pypi.douban.com/simple
    在这里插入图片描述
    安装对excel操作的模块: pip install openpyxl -i https://pypi.douban.com/simple
    在这里插入图片描述安装openpyxl成功之后还是会显示“no module named openpyxl”,是因为还没有把这个库加入到Pycharm中,按照文章 https://blog.csdn.net/Mr_kanger/article/details/111879098,程序运行成功

    import pandas
    hosts=[
        {'host':'1.1.1.1','hostname':'test1','idc':'ali'},
        {'host':'1.1.1.2','hostname':'test2','idc':'ali'},
        {'host':'1.1.1.3','hostname':'test3','idc':'huawei'},
        {'host':'1.1.1.4','hostname':'test4','idc':'ali'}
    ]
    #转换数据类型
    df = pandas.DataFrame(hosts)  #将hosts转换成二维DataFrame对象
    #存储成excel
    df.to_excel('doc/hosts.xlsx')
    print('success')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

  • 相关阅读:
    深度学习中的偏差、方差、正则化
    实验 | RT-Thread:L1
    Python014--python中的logging日志模块
    python的第三方模块pandas模块学习笔记
    基于spingboot通过spark-sql进行大批量插入clickhous分布式数据库
    Adobe产品2024
    数据库DML数据操作语言
    java计算机毕业设计新生报到管理系统源程序+mysql+系统+lw文档+远程调试
    Maven安装教程
    wifi c++源代码解析之一:速率调整minstrel HT之一
  • 原文地址:https://blog.csdn.net/qq_43604376/article/details/128074624