zoukankan      html  css  js  c++  java
  • 目录规范和time模块

      今天学习了目录规范和time模块:

      一、标准目录规范

        学习了模块和包以后,在开发项目就不应该再是面条版,应该分文件,分文件夹,那么有没有固定的文件结构呢?有!那就是开发目录规范

        例子:编写ATM  

        #file:"start.py"

        def login():

          #加载文件

          with open(r'Users/jerry/PycharmProjects/项目结构/db/db.txt') as f:

            print('f.read()')

        def register():

          print('注册')

        def run():

          while True:

            print(

            ''''请选择

            1、登录

            2、注册

    ''')

            s = input('请选择:')

            if s == '1':

              login()

            elif s == '2':

              register()

            else:

              print('error')

        1、在atm中我们市场要使用到文件的路径,例如日志文件,数据文件等,并且不止一个地方用 很多地方都要用,直接将路径写在代码中,是不可取的,因为你无可避免的会需要修改这些路径;

        所以不要直接写在代码中,那应该怎么做?定义为变量可行吗?当然 如此一来,修改的时候只需要修改一次即可!

        #file:"start.py"

        #数据路径

        DB_PATH = r'/Users/jerry/PycharmProjects/项目结构/db/db.txt'

        #日志路径

        LOG_PATH = r'/Users/jerry/PycharmProjects/项目结构/db/log.txt'

        def login():

          #加载文件

          with open(DB_PATH) as f:

            print(f.read())

        def register():

          print('注册')

        def run():

          while True:

            print('''请选择

            1、登录

            2、注册

    ''')

            s = input('请选择:')

            if s ==  '1':

              login()

            elif s == '2':

              register()

            else:

              print('error')

        但是当你想一想,此类用于配置程序的变量,应该和你的业务逻辑放在一起吗?显然不应该,所以我们要将用于配置的信息单独放在一个文件中

        #file:'setting.py'

        #数据路径

        DB_PATH = r'/Users/jerry/PycharmProjects/项目结构/db/db.txt'

        #日志路径

        LOG_PATH = r'Users/jerry/PycharmProjects/项目结构/db/db.txt'

        2、在接下来我们需要实现一个道理验证的功能,那这个功能,需要在所有关键操作之前进行验证,也就是说很多功能中都要调用这个功能,由于start中代码太多我们要进行拆分,这样一来,这个登录验证的代码我们可以将其放置于一个公共的common中

        common.py

        #登录验证装饰器

        def login_auth():

          pass

        3、除此之外,还有日志文log,数据文件db;

        4、另外我们可以将程序的业务逻辑和启动代码,进行分离,变成start文件和src文件

        start.py专门用于执行启动

        src中的业务逻辑,被start调用

        这样用户使用时就能很快定位到启动文件

        5、在一个面项目中,可能有很多执行文件 那我们可以将其统一到bin文件夹中

        最后一个规范的项目目录包含以下结构

        

      bin
    
      core
    
      conf
    
      lib
    
      db
      
      log
    
    
    readme(介绍文件)

     疑惑:这里的文件夹 是普通文件夹还是包?

     包的本质就是文件夹,所以在python项目中,文件夹也就是包,那么这里的核心问题是应不应该有init文件?

     先明确init的作用主要是为了集中所有的功能,让外界方便调用,那我们一个一个来看是否需要这两个功能

     bin 排除他是执行文件不需要被导入

     conf 配置文件,在你的项目中不可能只有一个配置文件,比如mysql,oracle,他们明显不是一家,你把他们的配置全集中到init文件中,只会给自己带来困扰

     core 业务逻辑,这其中一定有一个用户的入口,用户进入之后只是在这些不同业务中来回执行操作,所以这个文件夹下的模块是相互调用的关系,不需要集合所有功能给外界调用

     db,lib,log 没什么好说的明显不需要

     那什么样的代码该定义为包?例如你有一个下载文件的模块,这里面可能用到了网络请求到request.py,还有文件操作fileop.py 那就应该将它定义为包,因为这两个文件中的功能都哦是给别人调用的!

     ==总结:项目标准结构的 第一层仅仅是文件夹不是包!==

      二、定制程序的入口

      继续完善程序,使其可以展示用户功能界面 在src中定义run函数,用来启动程序,注意src所在的core中可能有多个文件,用户在使用时不方便,所以我们程序的入口从src中转移到start.py中

      在start.py中导入core下的src 并执行run

      

    #file:"start.py"
    import core.src
    core.src.run()

      由于core这个模块并不存在于环境变量中 ,所以程序无法运行!

      所以第一步:在环境变量中添加core

      

    #file:'start.py'
    import sys
    sys.path.append(r'C:\yyhpythonday20ATMcore')
    
    import core.src
    core.src.run()

      程序执行成功,但是以上写法存在两个问题,

      1、除了core,其他的lib,conf就无法使用

      为了能够找到所有模块,我们把ATM文件夹加入环境变量

      

    #file:'start.py'
    import sys
    sys.path.append(r'C:\yyhpythonday20ATM')

      2、如果用户的安装路径不同,程序也无法运行

      此时我们需要动态的获取当前项目的目录

      在一个py文件中可以使用file来获取当前文件的路径

      可以通过当前文件路径来获取文件所在的目录 使用os.path.dirname

      最终代码如下:

        

    #file:'start.py'
    import sys,os
    BASE_DIR = os.path.dirname(os.path.dirnam(__file__))
    sys.path.append(BASE_DIR)
    import core.src
    core.src.run()

      三、使用标准目录后

      引用配置文件          

      在上述案例中我们把文件的路径定义为变量并放在setting.py文件中

      那么在src中要使用这些变量 就需要导入conf下的setting.py

      由于在启动文件start.py中我们已经将项目根目录添加到path中,所以可以直接导入

      

    #file:'src.py' 部分代码
    #导入配置文件
    from conf import setting
    def login():
      #加载文件 使用配置文件中的路径
        with open(setting.DB_PATH) as f:
            print(f.read())
    def register():
        print('注册')

      引用自定义模块

      为上述案例添加日志功能

      

    #file:'src.py' 部分代码
    #日志功能
    def logger(msg):
        with open(r'User/jerry/PycharmProjects/项目结构/log/log.txt')as f:
            f.write(msg)
    #导入配置文件
    from conf import setting
    def login():
            #加载文件 使用配置文件中的路径
        with open(setting.DB_PATH) as f:
            print(f.read())
        logger('xxx登录系统')
    def register():
        print('注册')

      日志功能并不是只有src文件使用 所以我们将它提取为单独的模块

      在lib下的common中

    #file:'src.py' 部分代码
    #导入配置文件获取 日志路径
    from conf import setting
    #日志功能
    def logger(msg):
        with open(setting.LOG_PATH) as f:
                f.write(msg)

      在src中导入日志模块

      

    #file:'src.py' 部分代码
    from lib import common
    #日志功能
    def logger(msg):
        with open(r'User'jerry/PycharmProjects/项目结构/log/log.txt') as f:
            f.write(msg)
    
    #导入配置文件
    from conf import setting
    def login():
        #加载文件 使用配置文件中的路径
        with open(setting.DB_PATH) as f:
            print(f.read())
        logger('xxx系统登录')
    def register():
        print('注册')

      四、time模块

        该模块内部使用的是当前平台的c库 每个平台的c库支持的方法可能略有不同 

        时间三种格式

          1、时间戳

          2、格式化字符串时间

          3、结构化时间

        时间戳转结构化时间

        print(time.localtime(time.time()))本地

        print(time.gmtime(1111))UTC

        结构化转时间戳

        time.mktime(结构化)

        结构化转格式化

        time.strftime('格式',结构化时间)

        格式化时间转结构化

        time.strptime('2018-10-10','%Y-%m-%d')

        格式化时间可用的字符串

          time.strftime('')

          print(time.strftime('%Y-%m-%d %H:%M:%S'))

          print(time.strftime('%Y-%m-%d %X'))    

        了解

        格林威治时间

        time.asctime(可选结构化时间)

        time.ctime(可选时间戳)

        

      datetime 模块

      timedelta模块表示时间差

        包含三个可用名称

        days seconds micreseconds 微秒

        支持加减乘除

        可用方法

        total_seconds

      datetime

        获取当前时间 会根据当前系统时区自动转换 比较方便

        print(datetime.datetime.now().year)

        返回的是时间对象

        对象中包含一些变量

        年月日时分秒

        时间对象的减法运算

        一个时间对象与一个时间差对象timedelta 进行加减

        print(datetime.datetime.now()+datetime.timedelta(days = 1,hours = 1,minutes = 1,seconds = 1))

        30天后是几月几号?

        时间对象的替换操作

        replace 可替换某个时间的值

        

  • 相关阅读:
    Tarjan 的一些板子
    对 SAM 和 PAM 的一点理解
    一些敲可爱的数论板子
    异常
    面向对象编程
    JAVA数组
    JAVA方法
    JAVA流程控制
    JAVA基础
    JAVA入门
  • 原文地址:https://www.cnblogs.com/xiaocaiyang/p/9792654.html
Copyright © 2011-2022 走看看