Python之旅的第15天(osjsonsys模块,模块引入补充)

Posted 崆峒山肖大侠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之旅的第15天(osjsonsys模块,模块引入补充)相关的知识,希望对你有一定的参考价值。

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

一、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:\\Users\\xiaoyao28.CRHD0A\\PycharmProjects\\python_s1\\venv\\day22

#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:\\Users\\xiaoyao28.CRHD0A\\PycharmProjects\\python_s1\\venv\\day22\\os_test.py
# a = \'C:\\ooyao28.CRHD0A\\PycharmProjects\'
# b = \'python_s1\\venv\\day22\\os_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\'\\x80\\x03}q\\x00(X\\x04\\x00\\x00\\x00nameq\\x01X\\x04\\x00\\x00\\x00alexq\\x02X\\x03\\x00\\x00\\x00ageq\\x03K\\x12u.\'
# print(type(dic),dic)   #输出结果是:<class \'bytes\'> b\'\\x80\\x03}q\\x00(X\\x03\\x00\\x00\\x00ageq\\x01K\\x12X\\x04\\x00\\x00\\x00nameq\\x02X\\x04\\x00\\x00\\x00alexq\\x03u.\'
#                        #pickle将对应数据转换为了字节形式储存写入和读取
# f.write(dic)
# f.close()
#
# f_read = open(\'json_test\',\'rb\')
# a = pickle.loads(f_read.read())
# print(a[\'name\'])       #可正常得到\'alex\'

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

以上是关于Python之旅的第15天(osjsonsys模块,模块引入补充)的主要内容,如果未能解决你的问题,请参考以下文章

Python之旅的第2^4天(shelvexml模块和re模块部分)

Python之旅的第19天(类的初识)

Python之旅的第30天(过程记录,选课系统的基本实现)

Python之旅的第3²天(内置函数文件基本打开关闭)

Python之旅的第3²+1天(文件操作迭代器生成器)

Python之旅的第28天(描述符类的装饰器)