目录规范和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:\\yyh\python\day20\ATM\core')

import core.src
core.src.run()

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

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

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

  

#file:'start.py'
import sys
sys.path.append(r'C:\\yyh\python\day20\ATM')

  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 可替换某个时间的值

    

 

posted @ 2018-10-15 18:25  小菜鸟张阳阳  阅读(175)  评论(0编辑  收藏  举报