1.目录规范 *****

(1)文件夹的规范写法
bin 可执行文件
conf 配置文件
core 主要业务逻辑
db 数据文件
lib 库 (公共代码 第三方模块)
log 日志文件

readme 说明文档(是一个文件)
再以上文件夹中 没有需要作为包的 你的包通常放到lib中 但是注意lib不应该作为包
疑惑?
# 这个文件夹到底应该是包还是文件夹 其实问题就是需不需要用到init
# init的作用就是导入包内模块中的全部功能
# 通过判断是不是需要这个功能来判断是包还是文件夹

(2)定制程序的入口
# 总结 程序的入口 主要是将项目的根目录添加到环境变量中
(3)分文件夹之后的模块使用
2.time *****

一 标准目录规范

我们学习了模块和包以后,在开发项目就不应该再是面条版,应该分文件,文件夹,那么有没有什么固定的文件

结构呢?有!这就是我们要说的开发目录规范

我们通过一个例子来说明这些文件夹的作用

案例:编写ATM

  1. #file:"start.py"
  2. def login():
  3. #加载文件
  4. with open("/Users/jerry/PycharmProjects/项目结构/db/db.txt")as f:
  5. print(f.read())
  6. def register():
  7. print('注册'):
  8. def run():
  9.  
  10. while True:
  11. print(
  12. '''请选择
  13. 1.登录
  14. 2.注册
  15. '''')
  16. s = input("请选择:")
  17. if s=="":
  18. login()
  19. elif:s =="":
  20. register()
  21. else:
  22. print("error")

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

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

  1. #file:"start.py"
  2. #数据路径
  3. DB_PATH="/users/jerry/PyvharmPro jects/项目结构/db/db.txt"
  4. #日志路径
  5. LOG_PATH = "/users/jerry/PycharmProjects/项目结构/db/log.txt
  6. def login():
  7. #加载文件
  8. with open("/Users/jerry/PycharmProjects/项目结构/db/db.txt" as f:
  9. print(f.read())
  10. def register():
  11. print("注册")
  12. def run():
  13. while True:
  14. print(
  15. """请选择
  16. 1.登录
  17. 2.注册
  18. """)
  19. s = input("请选择:")
  20. if s== "":
  21. login()
  22. elif:s =="":
  23. register()
  24. else:
  25. print("error")

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

用于配置的信息单独放在一个文件中

  1. #file:"setting.py"
  2. #数据路径
  3. DB_PATH = "/Users/jerry/PycharnProjiects/项目结构/db/db.txt"
  4. #日志路径
  5. LOG_PATH = "/User/jerry/PycharmProjects/项目结构/log/log.txt"

2.在接下来我们需要实现一个道理验证的功能,name这个功能,需要在所有关键操作之前进行验证,也就是

说很多功能中都要调用这个功能.由于start中代码太多我们呢要进行拆分,这样一来.这个登录验证的代码

可以将其放置与一个公共的common中

  1. common.py
  2. #登录验证装饰器
  3. def login_auth()
  4. pass

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

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

start.py专门用于执行启动

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

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

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

最后一个规范的项目目录应包括一下结构

  1. bin
  2.  
  3. core
  4.  
  5. conf
  6.  
  7. lib
  8.  
  9. db
  10.  
  11. log
  12.  
  13. readme(介绍文件)

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

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

件?

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

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

conf配置文件,在你的项目中不可能只有给一个配置文件,比如mysql,oracle,他们明显不是一家,你把他们

的配置全集中到init文件中,只会给自己带来困扰t

core业务逻辑,这其中一定有一个用户关系的入口,用户进入以后只能在这些不同业务中来回执行操作,所以

这个文件夹下的模块是相互调用的关系,不需要集合所有功能给外界调用

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

那什么样的代码该定义为包?例如你有一个下载文件的模块,这里面可能用到了网络请求叫request.py,

还有文件操作fileopt.py 那就应该将它定义为包,因为这两个文件中的功能都是给别人调用的!

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

二.定制程序的入口

继续完善程序,四期可以展示用户功能界面 在src中定义run函数,用来启动程序,注意src所在的core中可

能有多个文件,用户在使用时不方便,所以我们程序的入口从src中转移到start.py中

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

  1. #file:"start.py"
  2. impiory core.src
  3. cor.src.run()

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

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

  1. #file:"start.py"
  2. import sys
  3. sys.path.append(r"C:\\yyh\python\day20\ATM\core")
  4.  
  5. import core.src
  6. core.src.run()

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

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

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

  1. #file:"start.py"
  2. import sys
  3. sys.path.appenf(r"c:\\yyh\python\day20\ATM

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

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

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

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

最终的代码如下:

  1. #file:"start.py"
  2. import sys,os
  3. BASE_DIR = os.path.dirname(os.path.dirname(__file__)))
  4. sys.path.append(BASE_DIR)
  5. import core.src
  6. core.src.run()

三.使用标准目录后

引用配置文件

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

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

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

#file:"src.py"部分代码

#导入配置文件

  1. from conf import setting
  2.  
  3. def login():
  4.  
  5.   #加载文件 使用配置文件中的路径
  6.  
  7.   with open(setting.DB_PATH( as f:
  8.  
  9.     print(f.read())
  10. def register():
  11.  
  12.   print("注册"")

引用自定义模块

为上述案列添加日志功能

  1. #file:"src.py" 部分代码
  2. #日志功能
  3. def logger(msg):
  4. with open("/Users/jerry/PycharmProjects/项目结构/log/log.txt") as f:
  5. f.write(msg)
  6. #导入配置
  7. from conf import setting
  8. def login():
  9. #导入配置文件
  10. with open(setting.DB_PATH) as f:
  11. print(f.read())
  12. logger("xxx登录系统")
  13. def register():
  14. print("注册")

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

在lib下comon中

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

在src中导入日志模块

  1. #file:"src.py" 部分代码
  2. from lib import common
  3. #日志功能
  4. def logger(msg):
  5. with open("/Users/jerry/PycharmProjects/项目结构/log/log.txt") as f:
  6. f.write(msg)
  7. #导入配置文件
  8. from conf import setting
  9. def login():
  10. #加载文件 使用配置文件中的路径
  11. with open(setting.DB_PATH) as f:
  12. print(f.read())
  13. logger("xxx登录系统")
  14. def register():
  15. print("注册")

第十九天 标准目录与time 模块的更多相关文章

  1. 孤荷凌寒自学python第二十九天python的datetime.time模块

     孤荷凌寒自学python第二十九天python的datetime.time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) datetime.time模块是专门用来表示纯时间部分的类. ...

  2. python-网络安全编程第十天(web目录扫描&&fake_useragent模块&&optionParser模块)

    前言 昨天的内容没有完成今天花了点时间继续完成了 感觉自己的学习效率太低了!想办法提高学习效率吧 嗯 ,再制定下今天的目标 开始健身. python fake_useragent模块 1.UserAg ...

  3. python第二十九天-----继续学习第三模块——前几天旅行去了

    subprocess模块 import subprocess subprocess.getstatusoutput('dir')#接收字符串格式命令,返回元组形式,第1个元素是执行状态,第2个是命令结 ...

  4. 孤荷凌寒自学python第七十九天开始写Python的第一个爬虫9并使用pydocx模块将结果写入word文档

    孤荷凌寒自学python第七十九天开始写Python的第一个爬虫9 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 到今天终于完成了对docx模块针对 ...

  5. 孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用数据表操作函数

    孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用数据表操作函数 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 不同类型 ...

  6. STC8H开发(十五): GPIO驱动Ci24R1无线模块

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  7. Linux 标准目录结构

    初学Linux,首先需要弄清Linux 标准目录结构 / root --- 启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home --- 存储普通用户的个人文件 ftp ...

  8. javaSE第十九天

    第十九天    227 1:异常(理解)    227 (1) 定义    227 a)异常的引入    227 (2)异常的体系    228 (3)异常的处理:    229 A:JVM的默认处理 ...

  9. Android MAVEN项目标准目录结构

    1.标准目录结构: src -main      –bin 脚本库      –java java源代码文件      –resources 资源库,会自动复制到classes目录里      –fi ...

随机推荐

  1. flask异常处理

    对于异常,通常可以分为两类:一类是可以预知的异常,我们通常会用try...except....捕捉,第二类是未知的error,我们是无法预知的. try: code block except A: e ...

  2. 两次console.log打印值不同

    var a=[1,2,3] console.log(a); a[2]=10; console.log(a); // 打印结果 // (3) [1, 2, 3] // (3) [1, 2, 10] // ...

  3. 阿里云作为yum源操作

    阿里云提供的yum镜像地址为:https://opsx.alibaba.com/mirror 找到自己的使用系统,点击帮助,可以查看更换说明 替换centOS的yum源,如下图 具体操作: CentO ...

  4. 多项式求值 n维多项式 Horner解法

    #include<iostream> using namespace std; template<class T> T ploy(T *coeff,int n,const T& ...

  5. Hadoop生态的配置

    网盘下载地址 链接: https://pan.baidu.com/s/19qWnP6LQ-cHVrvT0o1jTMg 密码: 44hs Hadoop伪分布式配置  Hadoop 可以在单节点上以伪分布 ...

  6. 周末时间学习Linux

    大家都是如何度过周末时光的呢?好多人都认为一周的工作后要好好休息下,于是在家疯狂的补觉,刷剧,打游戏,自我觉得很是正常,工作几天了,休息下不是当然嘛.是的,休息下很正常,但是把周末的时光都用到这些东西 ...

  7. WinRAR从入门到高级的操作技巧集合

    一.基础技巧 1.批量建立文件夹 如果在工作中,经常要建立很多相同文件夹结构(如在备份数据时).那可以把这个繁琐的工作让WinRAR完成:先在“资源管理器”中把多个文件夹结构建好(包括其下的子文件夹) ...

  8. ElasticSearch Nosql

    把 ElasticSearch 当成是 NoSQL 数据库 Elasticsearch 可以被当成一个 "NoSQL"-数据库来使用么? NoSQL 意味着在不同的环境下存在不同的 ...

  9. pycharm异常问题之Unable to save settings: Failed to save settings. Please restart PyCharm

    pycharm异常之Unable to save settings: Failed to save settings. Please restart PyCharm 今天一不小心将电脑关了,但是关机之 ...

  10. ES7的新特性

    ES7的新特性 ES7 特性: 1.Array.prototype.includes2.Exponentiation Operator(求幂运算) 一,Array.prototype.includes ...