• Python之旅的第15天(os、json、sys模块,模块引入补充)


    今天内容不多,所以都进行了测试

    一、bin.py文件也存在与子目录之下,如何通过bin.py文件转入main.py

      文件存储的大致位置:

      

      main.py文件存放内容

    from ceshi1 import add
    
    def run():
        print('main def start')
        print(add.ad(2,3))
        return 'main def start'

      add.py文件存放内容

    def add(x,y):
        return x+y

      bin.py文件内容和总结

    # 关于昨天讲到的bin.py文件放在ceshi(package)下,与ceshi1(package)放在同一子目录下的情况进行了补充
    # 大部分时候bin.py文件也会放在一个package下面,作为其中的一个文件,此时bin.py和main.py文件分别属于不同的文件夹
    # 此时应该如何实践import导入,最终正常执行main.py文件
    
    #之前的方法是
    # from ceshi.ceshi1 import main   #此时因为bin.py文件所在的路径已经不和ceshi1属于同一子目录,所以无法实现引入
    import sys,os
    # print(sys)   #此时显示文件的路径是C:/Users/xiaoyao28.CRHD0A/PycharmProjects/python_s1/venv/模块和包/ceshi/bin/bin.py
                  #但是这是pycharm修改后的结果,在终端运行的过程中往往只显示bin.py文件
    #此时我们知道了bin.py 的默认执行路径,我们可以跟怒sys内置的方法进行修改其默认路劲,再进行相关引入即可
    # sys.path.append(r'C:/Users/xiaoyao28.CRHD0A/PycharmProjects/python_s1/venv/模块和包/ceshi')
    #此时已经修改默认路径为ceshi(package)所在目录,再进行from导入,查看是否可以运行
    # from ceshi1 import main
    # main.run()
    #此时文件可以正常运行,但是这样得到的固定文件路径,一旦更换运行设备就没法正常运行了
    #所以需要引入os模块中的一些功能
    #os.path.dirname 获得文件路径的上一层路径
    #但是我们在前面也提到__file__获得的只是bin.py,而前面的路径是pycharm加上的
    #os.path.abspath(__file__) 获得文件的绝对路径,即前面那一堆加上了
    
    # bas = os.path.abspath(__file__)   #获取当前执行的bin.py文件所在绝对路径
    # bas_up = os.path.dirname(os.path.dirname(bas))   #这样通过两次返回上一层,就获得了正确的默认测试路径
    #                                                  #即为C:/Users/xiaoyao28.CRHD0A/PycharmProjects/python_s1/venv/模块和包/ceshi
    # sys.path.append(bas_up)    #以bas_up变量为参数,临时修改默认路径
    # from ceshi1 import main
    # main.run()      #可正常运行,就算更换设备也不影响正常使用

    二、os模块

    import os
    #os模块内容
    #os.getcwd 获取当前工作目录,即为上一级的绝对路径
    # print(os.getcwd())   #输出结果:C:Usersxiaoyao28.CRHD0APycharmProjectspython_s1venvday22
    
    #os.chdir('path') 改变当前工作目录,输入path为要切换的文件名,如果输入'..'表示返回上一级
    # os.chdir('..')
    # print(os.getcwd())
    
    #os.makedirs('dirname/dirname') 生成多层递归目录
    # os.makedirs('dirname/dirname1')
    #os.removedirs('path')  删除该文件目录,若该文件目录为空,则删除,同时递归至上一层文件目录,若为空则删除,以此类推
    # os.removedirs('dirname/dirname1')
    
    #os.mkdir('dirmame')  生成单级目录
    # os.mkdir('dirname')
    #os.rmdir('dirname')  删除单级目录,若该单级目录不为空则无法删除,系统会报错
    # os.rmdir('dirname')
    
    #os.listdir('dirname')  列出制定目录下的所有文件和子目录,包含隐藏文件,并以列表方式打印
    # print(os.listdir())   #输出:['os_test.py', '__init__.py']
    
    #os.remove('path')  制定删除一个文件
    #os.rename('oldname','newname')  重新命名文件或目录
    
    #os.stat('dirname')  获取文件的相关状态,访问时间、修改时间、大小等
    # os.chdir('..')
    # print(os.stat('ceshi'))
    #输出os.stat_result(st_mode=33206, st_ino=3377699720828849, st_dev=4176561250, st_nlink=1,
    # st_uid=0, st_gid=0, st_size=1077, st_atime=1583500656, st_mtime=1583506954, st_ctime=1583500638)
    # atime上次访问时间  mtime最新修改时间   ctime文件创建时间
    
    #os.sep('path/filename') 获取文件/目录的信息
    # print(os.sep)   #不同操作系统输出不同斜线
    
    # os.linesep 输出当前平台使用的行终止符
    # os.pathsep 输出当前平台文件路径字符串的分隔符   win是';'  linux是':'
    # os.name    输出当前运行的平台,用于跨平台运行的选择
    
    # os.system('dir')  运行shell命令,直接显示(这个还不是很清晰)
    
    # os.path.split('path')  将path分割成目录和文件名二元组返回
    # os.path.dirname('path')  返回path的目录名
    # os.path.basename('path')  返回path的文件名
    # print(os.path.split(__file__))
    #输出结果:('C:/Users/xiaoyao28.CRHD0A/PycharmProjects/python_s1/venv/day22', 'os_test.py')
    # print(os.path.dirname(__file__))
    #输出结果就是split输出元组的前半部分,C:/Users/xiaoyao28.CRHD0A/PycharmProjects/python_s1/venv/day22
    # print(os.path.basename(__file__))
    #输出结果就是split输出元组的后半部分,os_test.py
    
    # os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
    # os.chdir('..')
    # print(os._exists('day22'))
    
    # os.path.isabs(path)  如果path是绝对路径,返回True
    # b = os.path.abspath(__file__)
    # print(os.path.isabs(b))
    
    # os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False
    # print(os.path.isfile('os_test.py'))
    
    # os.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回False
    # os.chdir('..')
    # print(os.path.isdir('day22'))
    
    # os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
    # print(os.path.abspath(__file__))
    #C:Usersxiaoyao28.CRHD0APycharmProjectspython_s1venvday22os_test.py
    # a = 'C:ooyao28.CRHD0APycharmProjects'
    # b = 'python_s1venvday22os_test.py'
    # print(os.path.join(a,b))   #用join拼接的字符串可以适应各种操作系统
    
    # os.path.getatime(path)  返回path所指向的文件或者目录的最后存取时间
    # os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间
    # 相当于直接获取os.stat中的部分内容
    
    # os.environ 获取系统环境变量
    # print(os.environ)

    三、sys模块

    import sys,time
    # sys模块部分内容比较少
    
    # sys.argv  命令行参数List,第一个元素是程序本身路径
    # 我们在制作或者执行文件时,中间会让程序停下来进行input()操作,而使用sys.argv则可在程序运行开始就传输相关参数
    
    # sys.exit(n) 退出程序,正常退出时exit(0)
    # sys.version 获取Python解释程序的版本信息
    # sys.maxint  最大的Int值
    # sys.path  返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    # sys.platform 返回操作系统平台名称
    # sys.stdout.write() 类似于输出语句,可用于制作进度条
    # for i in range(50):
    #     sys.stdout.write('_')
    #     time.sleep(0.2)
    #     sys.stdout.flush()   #增加此句的功能是为了让一旦有输出语句就可以立即刷新
    #                          #以前都是等整个for循环完成后统一一块输出,这样可以做成类似进度条

    四、json&pickle模块

    import json,pickle
    #json是可以将数据转换为json类型的字符串,可用于任何语言的传输
    #下面以文件写入字典为例介绍一下json
    #需求:信件文件test,吸入字典{'name':'alex','age':18},保证可被读取
    #之前都是用的eval
    # dic = {'name':'alex','age':18}
    #
    # f = open('json_test','w')
    # dic = str(dic)
    # f.write(dic)
    # f.close()
    #
    # f_read = open('json_test','r')
    # a = eval(f_read.read())
    # print(a['name'])
    
    #但是在实际操作过程中eval也存在有局限性,不能保存函数,以及不能被其他语言识别等
    
    #引入json
    #json.dumps()  将数据转换为json类型的字符串
    #json.loads()  读取json类型字符串,将其转化回来
    # dic = {'name':'alex','age':18}
    # f = open('json_test','w')
    # dic = json.dumps(dic)
    # print(dic)     #此处输出结果:{"name": "alex", "age": 18}
    #                #在json.dumps的过程中,首先是把dic内的所有单引号变为双引号,同时在外部加入引号,保证成为标准json字符串类型
    # print(type(dic),dic)   #输出结果:<class 'str'> {"age": 18, "name": "alex"}
    # f.write(dic)
                    #关于dumps的用法,直接书写为json.dump(dic,f)
    # json.dump(dic,f)   #这一句等同于dic = json.dumps(dic)   f.write(dic)
                       #为了便于记录,还是不要这么偷懒
                       #json.load 和 json.loads的区别也是一样的
    # f.close()
    #
    # f_read = open('json_test','r')
    # a = json.loads(f_read.read())   #json.loads使用的前提是对应的值必须是一个标准的json类型字符串
                                      #如果我们自己书写的字符串,必须满足双引号的要求才能转换
    # print(a['name'])
    
    # 关于pickle的作用,本质上和json相同,但是pickle是用于python之间的数据交换,能够转换的范围更大
    # # pickle是将给的数据类型转换为字节的形式储存
    # dic = {'name':'alex','age':18}
    # f = open('json_test','wb')
    # dic = pickle.dumps(dic)
    # print(dic)    #输出结果是:b'x80x03}qx00(Xx04x00x00x00nameqx01Xx04x00x00x00alexqx02Xx03x00x00x00ageqx03Kx12u.'
    # print(type(dic),dic)   #输出结果是:<class 'bytes'> b'x80x03}qx00(Xx03x00x00x00ageqx01Kx12Xx04x00x00x00nameqx02Xx04x00x00x00alexqx03u.'
    #                        #pickle将对应数据转换为了字节形式储存写入和读取
    # f.write(dic)
    # f.close()
    #
    # f_read = open('json_test','rb')
    # a = pickle.loads(f_read.read())
    # print(a['name'])       #可正常得到'alex'

    后面我会把自己的进度放的慢一些,因为感觉内容真的越来越多,主要还是需要更多的练习,今天的内容就是这些啦。

  • 相关阅读:
    Java 并发编程解析 | 关于Java领域中的线程机制,我们应该知道的那些事?
    Java 并发编程解析 | 如何正确理解线程机制中常见的I/O模型,各自主要用来解决什么问题?
    Java 并发编程解析 | 关于线程机制的那些事,你究竟了解多少?
    Java 并发编程解析 | 每个Java Developer都应该知道的关于并发编程的那点事?
    identity4 系列————开篇概念[一]
    identity4 系列————持久化配置篇[五]
    mongodb基础整理篇————副本概念篇[外篇]
    c# 异步进阶————channel [一]
    mongodb基础整理篇————副本原理篇[外篇]
    identity4 系列————案例篇[三]
  • 原文地址:https://www.cnblogs.com/xiaoyaotx/p/12445952.html
Copyright © 2020-2023  润新知