一、模块说明

模块加载顺序:内置模块 --> 内存 --> 磁盘(sys.path)

模块导入忽略或者指定只能导入说明

xiecheng

_name = 'ckl'
_age = '21'
hoppy = 'eat'

test

from xiecheng import *
print(hoppy)
print(name)
print(age)

导入使用*时候,_name和_age不会被加载

xiecheng

__all__ = ['name','age']
name = 'ckl'
age = '21'
hoppy = 'eat'

test

from xiecheng import *print(name)
print(age)
print(hoppy)

执行:

在使用*导入时候指定__all__,只导入这个列表的里面的内容

python文件使用场景

1.文件当做脚本运行__name__等于__main__

2.文件当做模块加载运行时__name__等于模块名

二、关于包说明

包内的文件供调用使用,不要直接执行

包导入示例

1.目录结构

2.模块内容

m1.py

def func1():print('-----> from func1')

m2.py

def func2():print('-----> from func2')

m3.py

def func3():print("----> from func3")

3.运行run

3.1.调用m3

import m3
m3.func3()

运行结果:

3.2.调用m1导入spring

import m3
import springsm3.func3()
springs.m1.func1()

报错:

因为运行的是run,run找的是sys.path路径里面的m1,当前路径没有m1,spring路径的__init__.py,在文件里面没有导入m1

from springs import m1

再次运行程序:

3.3.调用m2同理

在summer的__init__.py导入m2

from summer import m2

调用:

import m3
import springs
import summerm3.func3()
springs.m1.func1()
summer.m2.func2()

运行结果:

进一步思考,如果springs里面再有一个包呢,结构如下:

m4内容:

def func4():print('-----> i am f4')

如果run想调用m4

import m3
import springs
import summerm3.func3()
springs.m1.func1()
summer.m2.func2()
springs.winter.m4.func4()

报错:

同样需要在spings的__init__.py导入m4

from springs import m1
from springs.winter import m4

运行结果:

包的导入,点的左边必须是包

包的绝对导入与相对导入

示例如下:

run想运行所有函数:

import glimpse
glimpse.get()
glimpse.create_a()
glimpse.main()
glimpse.register()

运行如下:

无法找到模块,需要在__init__.py导入模块

添加如下:

from glimpse.api.policy import get
from glimpse.api.version import create_a
from glimpse.cmd.manage import main
from glimpse.db.models import register

运行结果:

问题来了,绝对导入要加入所有路径,如果glimpse名称改变,所有导入都要改变,那相对导入呢?

相对导入修改__init__.py:

from .api.policy import get
from .api.version import create_a
from .cmd.manage import main
from .db.models import register

执行结果:

问题2,如果要在policy导入manage的模块呢?

policy 导入manage,相对导入

from ..cmd.manage import main
def get():print("----> I AM GET")main()

manage:

def main():print("---- I AM MAIN")

运行run

import glimpse
glimpse.get()

结果:

架构简单说明

如果main想调用src的函数,怎么实现?

调用src必须获得src的路径,查看main获取大路径:

import sys
print(sys.path)

如下:

['/Users/kindle/PycharmProjects/SDM/bin', ...]

在mian的路径必须获取到上层目录如bin,conf...

1.获取到当前文件绝对路径

import sys
import os
print(os.path.abspath(__file__))

/Users/kindle/PycharmProjects/SDM/bin/main.py

2.获取到上级目录路径

import sys
import os
print(os.path.dirname(os.path.abspath(__file__)))

/Users/kindle/PycharmProjects/SDM/bin

3.再获取到上级路径

import sys
import os
print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

/Users/kindle/PycharmProjects/SDM

4.通过获取的路径可以加入sys.path,之后导入任何子目录里面的模块

import sys
import os
BASEPATH=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASEPATH)
from core import srcif __name__ == '__main__':src.souc()

冒泡排序

 1 #!/usr/bin/env python
 2 #-*- coding:utf-8 -*-
 3 """
 4 冒泡排序
 5 """
 6 NumList = [10,4,33,21,54,3,8,11,5,22,2,1,17,13,6]
 7
 8 def BubblingSort(args):
 9     NumLength = NumList.__len__()
10     EndNum = NumLength
11     for j in range(1,EndNum):
12         #循环获取索引值,范围不能超过长度
13         for i in range(EndNum-j):
14             #如果当前的索引所在的值,大于下一个索引所在的值,则进行替换
15             if NumList[i] > NumList[i+1]:
16                 tmp = NumList[i+1]
17                 NumList[i+1] = NumList[i]
18                 NumList[i] = tmp
19     print(NumList)
20
21 BubblingSort(NumList)

模拟小程序

结构大概是这样的:

#tree

.
├── Backend
│   ├── db
│   │   ├── __init__.py
│   │   └── SqlApi.py
│   └── logic
│   ├── handle.py
│   └── __init__.py
├── Config
│   ├── __init__.py
│   └── settings.py
└── Frontend
├── __init__.py
└── UserMain.py

SqlApi.py:

 1 #!/usr/bin/env python
 2 #-*- coding:utf-8 -*-
 3 from day05.CklDj.Config import settings
 4 def db_auth(configs):
 5     if configs.DATABASE["user"] == 'root' and configs.DATABASE["password"] == "123":
 6         print("db auth passed")
 7         return True
 8     else:
 9         print("db login error....")
10
11 def Select(table,colume):
12     if db_auth(settings):
13         if table == 'user':
14             user_info = {
15                 "001":['ckl',23,'engineer'],
16                 "002":['zld',21,'Manager'],
17                 "007":['xxx',28,'chef']
18             }
19             return user_info

handle.py

 1 #!/usr/bin/env python
 2 #-*- coding:utf-8 -*-
 3
 4 from day05.CklDj.Backend.db.SqlApi import Select
 5
 6 def Home():
 7     print("welcome to home page!")
 8     Qdata = Select("user",'wukaka')
 9     print("query ress:",Qdata)
10
11 def Movie():
12     print("welcome to movie page!")
13
14 def Tv():
15     print("welcome to Tv page!")

settings.py

 1 #!/usr/bin/env python
 2 #-*- coding:utf-8 -*-
 3
 4 DATABASE = {
 5     "engine":"mysql",
 6     "host":"localhost",
 7     "port":3306,
 8     "user":"root",
 9     "password":"123"
10 }

UserMain.py

#!/usr/bin/env python
#-*- coding:utf-8 -*-import sys
from day05.CklDj.Backend.logic import handle
handle.Home()

执行UserMain.py结果:

welcome to home page!
db auth passed
query ress: {'001': ['ckl', 23, 'engineer'], '002': ['zld', 21, 'Manager'], '007': ['xxx', 28, 'chef']}

关于信用卡购物、取现的示例小程序

目录结构如下:

.
├── ATM
│   ├── __init__.py
│   └── UseAtm.py
├── card.log
├── Conf
│   ├── __init__.py
│   └── Settings.py
├── Credit
│   ├── CreditCard.py
│   └── __init__.py
├── CreditAtmMain.py
├── Demand
├── lock_file
├── Market
│   ├── __init__.py
│   └── UseMarket.py
└── pass_file

ATM/UseAtm.py

  1 #!/usr/bin/env python
  2 #-*- coding:utf-8 -*-
  3 import sys
  4 import pickle
  5 import re
  6 import time
  7
  8 #导入信用卡模块,调用登录方法
  9 from day05.hw05.Credit import CreditCard
 10
 11 AllCardDict = CreditCard.PayInterface()
 12 CardDisct = CreditCard.Login()
 13 CardNum = CardDisct[0]
 14
 15 def TakeCash():
 16     try:
 17         #提取账户总额和消费总额
 18         AllMoney = CardDisct[2][CardDisct[0]][CardDisct[1]]['GeneralAccount']
 19         Consumption = CardDisct[2][CardDisct[0]][CardDisct[1]]['SpendMoney']
 20         print("You left %s RMB,You can take %s RMB" %(AllMoney,AllMoney))
 21
 22         ConTakeMony = True
 23         while ConTakeMony:
 24             #如果账户余额大于100块,则执行
 25             if int(AllMoney) >= 100:
 26                 TakeMoney = input("Please input you want take money: ")
 27                 MatchNum = re.findall("\D",TakeMoney)
 28                 #如果非数字,则重新输入
 29                 if MatchNum:
 30                     print("You must only enter a number !")
 31                     continue
 32                 #如果不是100的整数,则重新输入
 33                 elif int(TakeMoney) % 100 != 0:
 34                     print("You must take an integer of 100 try again...")
 35                     continue
 36                 #如果取款的金额大于2000,则重新输入
 37                 elif int(TakeMoney) > 2000:
 38                     print("you take must less than 2000,try again...")
 39                     continue
 40                 #取款的金额不能大于余额
 41                 elif int(TakeMoney) > int(AllMoney):
 42                     print("You can take all of moeny is %s ,try again" %AllMoney)
 43                     continue
 44                 else:
 45                     #余额等于减去取款的金额,消费等于加上取款的金额
 46                     AllMoney = int(AllMoney) - int(TakeMoney)
 47                     Consumption += int(TakeMoney)
 48                     OperateContext = "提取现金"
 49                     NowTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
 50                     LogFile = open('D:\s12\day05\hw05\card.log', 'a')
 51                     LogFile.write("\n%s\t%s\t-%s\t%s" %(CardNum,OperateContext,TakeMoney,NowTime))
 52                     LogFile.close()
 53
 54                     #循环是否退出
 55                     while True:
 56                         Answer = input("Do you wanna continue to take cash ? (y|n)")
 57                         if Answer == "y":
 58                             break
 59                         elif Answer == "n":
 60                             print("You will exit and take away your card !")
 61                             ConTakeMony = False
 62                             break
 63                         else:
 64                             print("You must choose y or n !")
 65             else:
 66                 print("Sorry,Insufficient account balance!")
 67                 break
 68         #定义卡片自动的总额,消费的金额
 69         CardDisct[2][CardDisct[0]][CardDisct[1]]['GeneralAccount'] = AllMoney
 70         CardDisct[2][CardDisct[0]][CardDisct[1]]['SpendMoney'] = Consumption
 71         #将所有结果通过pickle存储到文件里
 72         pickleFile = open('D:\s12\day05\hw05\pass_file', 'wb')
 73         pickle.dump(CardDisct[2], pickleFile)
 74         pickleFile.close()
 75     except:
 76         pass
 77
 78
 79 def RepayMent():
 80     try:
 81         # 提取账户总额和消费总额
 82         ReAllMoney = CardDisct[2][CardDisct[0]][CardDisct[1]]['GeneralAccount']
 83         ReConsumption = CardDisct[2][CardDisct[0]][CardDisct[1]]['SpendMoney']
 84         print("You spend %s RMB,You can Repay %s RMB" % (ReConsumption, ReConsumption))
 85         ConRepayMony = True
 86         while ConRepayMony:
 87             #如果账单金额大于0,说明要还
 88             if ReConsumption > 0:
 89                 RepayMoney = input("Please input you want repay money: ")
 90                 ReMatchNum = re.findall("\D", RepayMoney)
 91                 #如果不是数字,需要重新输入
 92                 if ReMatchNum:
 93                     print("You must only enter a number !")
 94                     continue
 95                 #如果不能整除100,则需要重新输入
 96                 elif int(RepayMoney) % 100 != 0:
 97                     print("You must repay an integer of 100, try agin...")
 98                     continue
 99                 #偿还的钱不能大于账单的金额
100                 elif int(RepayMoney) > int(ReConsumption):
101                     print("you repay must less than %s " %ReConsumption)
102                 else:
103                     #消费账户等于消费金额减去偿还金额,总余额等于加上偿还金额
104                     ReConsumption = int(ReConsumption) - int(RepayMoney)
105                     ReAllMoney += int(RepayMoney)
106                     ReContext = "还款"
107                     NowTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
108                     LogFile = open('D:\s12\day05\hw05\card.log', 'a')
109                     LogFile.write("\n%s\t%s\t+%s\t%s" % (CardNum, ReContext, RepayMoney,NowTime))
110                     LogFile.close()
111                     #循环提示继续输入
112                     while True:
113                         if int(ReConsumption) > 0:
114                             Answer = input("Do you wanna continue to repay cash ? (y|n)")
115                             if Answer == "y":
116                                 break
117                             elif Answer == "n":
118                                 print("You will exit and take away your card !")
119                                 ConRepayMony = False
120                                 break
121                             else:
122                                 print("You must choose y or n !")
123                         else:
124                             print("You repay has been done.")
125                             ConRepayMony = False
126                             break
127             else:
128                 print("You have no bill to repay!")
129                 break
130         #定义总账户金额,定义消费金额
131         CardDisct[2][CardDisct[0]][CardDisct[1]]['GeneralAccount'] = ReAllMoney
132         CardDisct[2][CardDisct[0]][CardDisct[1]]['SpendMoney'] = ReConsumption
133         #将结果存到文件里
134         pickleFile = open('D:\s12\day05\hw05\pass_file', 'wb')
135         pickle.dump(CardDisct[2], pickleFile)
136         pickleFile.close()
137     except:
138         pass
139
140 def TransPay():
141     try:
142         #获取当前登录用户账户信息
143         TranLeft = CardDisct[2][CardDisct[0]][CardDisct[1]]['GeneralAccount']
144         TranSpend = CardDisct[2][CardDisct[0]][CardDisct[1]]['SpendMoney']
145
146         #输入需要转入的用户账户
147         TransAccount = input("Please input your transfer Account: ")
148         print("1")
149         ConTrans = True
150         print("2")
151         while ConTrans:
152             print("3")
153             #如果账户存在
154             print(AllCardDict.keys)
155             if TransAccount in AllCardDict.keys():
156                 print("4")
157                 for t in AllCardDict[TransAccount].keys():
158                     TanKey = t
159                 print("5")
160                 # 获取接受转账的用户账户信息
161                 MorauLeft = AllCardDict[TransAccount][TanKey]['GeneralAccount']
162                 MorauSpend = AllCardDict[TransAccount][TanKey]['SpendMoney']
163                 TransMoney = input("Please input your wanna transfer money: ")
164                 if int(TransMoney) <= TranLeft:
165                     #转出账户总额减去转出金额
166                     TranLeft -= int(TransMoney)
167                     #转出账户花费加上转出金额
168                     TranSpend += int(TransMoney)
169                     #转入的账户总额加上接受的金额
170                     MorauLeft += int(TransMoney)
171                     TranContext = "转账"
172                     NowTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
173                     LogFile = open('D:\s12\day05\hw05\card.log', 'a')
174                     LogFile.write("\n%s\t%s\t-%s\t%s" % (CardNum, TranContext, TransMoney,NowTime))
175                     LogFile.close()
176                     #循环继续输入
177                     while True:
178                         if TranLeft > 0:
179                             Answer = input("Do you wanna continue to trans money ? (y|n)")
180                             if Answer == "y":
181                                 break
182                             elif Answer == "n":
183                                 print("You will exit and take away your card !")
184                                 ConTrans = False
185                                 break
186                             else:
187                                 print("You must choose y or n !")
188                         else:
189                             print("You hava no moeny to trans.")
190                             ConTrans = False
191                             break
192                 else:
193                     print("Sorry, you left money is only %s" % TranLeft)
194                     continue
195             else:
196                 print("Sorry,you transfer account not found,try again")
197                 continue
198
199         #账户余额变化
200         AllCardDict[TransAccount][TanKey]['GeneralAccount'] = MorauLeft
201         AllCardDict[CardDisct[0]][CardDisct[1]]['GeneralAccount'] = TranLeft
202         AllCardDict[CardDisct[0]][CardDisct[1]]['SpendMoney'] = TranSpend
203         #写入到文件
204         pickleFile = open('D:\s12\day05\hw05\pass_file', 'wb')
205         pickle.dump(AllCardDict, pickleFile)
206         pickleFile.close()
207     except:
208         pass
209
210 if "__name__" == "__main__":
211     pass

Credit/CreditCard.py

  1 #!/usr/bin/env python
  2 #-*- coding:utf-8 -*-
  3 import sys
  4 import pickle
  5 import time
  6
  7 #定义账户字典
  8 CardAccount = {
  9     '006195280':{
 10         '629893':{
 11             'GeneralAccount': 30000,
 12             'SpendMoney':0,
 13         }
 14     },
 15     '004035208':{
 16         '889060':{
 17             'GeneralAccount': 20000,
 18             'SpendMoney': 0,
 19         }
 20     }
 21 }
 22
 23 #定义锁字典
 24 LockAccount = {
 25     '006195280':{
 26         'Lock':0
 27     },
 28     '004035208':{
 29         'Lock':0
 30     }
 31 }
 32
 33
 34 #pickle 将文件持久化到文件中,初始卡
 35 def InitialCards():
 36     #CardAccount = {'006195280': '629893'}
 37     pickleFile = open('D:\s12\day05\hw05\pass_file', 'wb')
 38     pickle.dump(CardAccount, pickleFile)
 39     pickleFile.close()
 40
 41     LockFile = open('D:\s12\day05\hw05\lock_file', 'wb')
 42     pickle.dump(LockAccount, LockFile)
 43     LockFile.close()
 44
 45     LogFile = open('D:\s12\day05\hw05\card.log', 'w')
 46     LogFile.write("卡号\t交易内容\t金额\t日期")
 47     LogFile.close()
 48
 49
 50 #加载卡信息,从pickle文件中加载
 51 def LoadCards():
 52     passFile = open('D:\s12\day05\hw05\pass_file', 'rb')
 53     CardPassDict = pickle.load(passFile)
 54     CardsList = CardPassDict.items()
 55     passFile.close()
 56
 57 #登录模块
 58 def Login():
 59     #加载卡信息
 60     passFile = open('D:\s12\day05\hw05\pass_file', 'rb')
 61     CardPassDict = pickle.load(passFile)
 62     CardsList = CardPassDict.items()
 63     passFile.close()
 64
 65     #加载锁字典信息
 66     LockFile = open('D:\s12\day05\hw05\lock_file', 'rb')
 67     LockDict = pickle.load(LockFile)
 68     LockFile.close()
 69
 70     InputCardNum = input("Please input your card number: ")
 71     #检查账户是否被锁定,如果提示KeyError恰好说明这个账户不存在
 72     try:
 73         isLocked = LockDict[InputCardNum]['Lock']
 74         if isLocked  == 1:
 75             print("Sorry,you have been locked")
 76             return 4
 77     except KeyError:
 78         print("i can not find you !")
 79         return 3
 80     #循环三次机会输入密码
 81     for i in range(3):
 82         InputCardPass = input("Please input your card pass: ")
 83         CardDictList = CardPassDict[InputCardNum].keys()
 84         for c in CardDictList:
 85             CardNum = c
 86         if InputCardPass == CardNum:
 87             print("Login....it will take a few minute!")
 88             time.sleep(3)
 89             print("Welcome Login Credit Card center !")
 90             #返回卡号、卡密码、卡密码字典
 91             return InputCardNum,InputCardPass,CardPassDict
 92         else:
 93             '''计算剩余机会'''
 94             leaveTimes = 2 - i
 95             if leaveTimes > 0:
 96                 print("sorry , you have %s chance!" % leaveTimes)
 97             elif leaveTimes == 0:
 98                 print("hollyshit, you must be reject and be locked!")
 99                 '''如果三次机会用完,则在密码后加#,锁定用户'''
100                 LockDict[InputCardNum]['Lock'] = 1
101                 passFile = open('D:\s12\day05\hw05\lock_file', 'wb')
102                 pickle.dump(LockDict,passFile)
103                 passFile.close()
104
105
106 def PayInterface():
107     #加载信息
108     passFile = open('D:\s12\day05\hw05\pass_file', 'rb')
109     CardPassDict = pickle.load(passFile)
110     #print(CardPassDict)
111     passFile.close()
112
113     LockFile = open('D:\s12\day05\hw05\lock_file', 'rb')
114     LockDict = pickle.load(LockFile)
115     #print(LockDict)
116     LockFile.close()
117     return CardPassDict
118
119 def PrintLog():
120     LogFile = open('D:\s12\day05\hw05\card.log','r')
121     for i in LogFile.readlines():
122         print(i)
123     LogFile.close()
124
125
126 if "__name__" == "__main__":
127     pass

CreditAtmMain.py

 1 #!/usr/bin/env python
 2 #-*- coding:utf-8 -*-
 3
 4 #from day05.hw05.ATM import UseAtm
 5 #UseAtm.TakeCash()
 6
 7 OperatDict = {
 8     1:"ATM操作",
 9     2:"购物",
10     3:"查看账单"
11 }
12
13 AtmDict = {
14     1:"取款",
15     2:"还款",
16     3:"转账"
17 }
18
19 def PrintList():
20     print("操作列表:")
21     print("="*30)
22     for k,v in OperatDict.items():
23         print(k,v)
24
25 def PrintATM():
26     print("ATM操作列表:")
27     print("="*30)
28     for i,j in AtmDict.items():
29         print(i,j)
30
31
32 PrintList()
33 try:
34     OperatorNum = input("Please input your opterator number: ")
35     if OperatorNum == "1":
36         print("")
37         print("Now you will operator the ATM")
38         print("-"*30)
39         PrintATM()
40         from day05.hw05.ATM import UseAtm
41         AtmOptNum = input("Please input ATM number: ")
42         if AtmOptNum == "1":
43             UseAtm.TakeCash()
44         elif AtmOptNum == "2":
45             UseAtm.RepayMent()
46         elif AtmOptNum == "3":
47             UseAtm.TransPay()
48         else:
49             print("Sorry,you should enter a number in (1 or 2 or 3)")
50     elif OperatorNum == "2":
51         from day05.hw05.Market import UseMarket
52         UseMarket.Shoping()
53     elif OperatorNum == "3":
54         from day05.hw05.Credit import CreditCard
55         CreditCard.PrintLog()
56     else:
57         print("Sorry,you should enter a number in (1 or 2 or 3)")
58 except:
59     pass

Market/UseMarket.py

  1 #!/usr/bin/env python
  2 #-*- coding:utf-8 -*-
  3
  4 import sys
  5 import pickle
  6 import time
  7 from day05.hw05.Credit import CreditCard
  8 ShopCartDict = {}
  9 Wallet = [0]
 10
 11 #定义商品字典包含编号、名称、价格
 12 GoodsBuyDict = {
 13     '1':{
 14          'ipad':3000
 15     },
 16     '2':{
 17          'mac':21000
 18     },
 19     '3':{
 20         'car':29000
 21     },
 22     '4':{
 23         'bag':1800
 24      },
 25     '5':{
 26         'tv':2800
 27      },
 28     '6':{
 29         'dress':660
 30      },
 31     '7':{
 32         'skirt':280
 33      },
 34     '8':{
 35         'umbrella':75
 36     }
 37 }
 38
 39 #定义一个打印商品名称的方法
 40 def PrintGoods():
 41     print("goods list".center(32, '='))
 42     for Gnum, Gdic in GoodsBuyDict.items():
 43         for Goods, Price in Gdic.items():
 44             print('%s No. is %-5s price is :\t%s' % (Gnum, Goods, Price))
 45
 46 #定义一个打印购物车清单的方法
 47 def PrintGcart():
 48     print("")
 49     print("-" * 30)
 50     for i,j in ShopCartDict.items():
 51             print("The %d number of %s prices is %d " %(j[1],i,j[0]*j[1]))
 52     print("-"*30)
 53
 54 def Shoping():
 55     Gbool = True
 56     while Gbool:
 57         PrintGoods()
 58         #循环输入需要购买的商品编号
 59         InputNum = input("Please input you wanna buy goods Number: ")
 60
 61         #定义还能购买的商品列表,初始为空
 62         CanBuyDict = {}
 63
 64         #定义一个方法来收集已经购买的商品并增加到CanBuyDict字典里
 65         def CanBuyFunc():
 66             for GoodsPrice in GoodsBuyDict.values():
 67                 for Gname, Gprice in GoodsPrice.items():
 68                     CanBuyDict[Gname] = Gprice
 69
 70         #如果输入的序列号存在就开始操作
 71         if InputNum in GoodsBuyDict.keys():
 72             for Gk,Gp in GoodsBuyDict[InputNum].items():
 73                 #定义重复商品变量,初始为1
 74                 Overlapping = 1
 75                 #如果商品没在字典里,则直接添加
 76                 if Gk not in ShopCartDict:
 77                     ShopCartDict[Gk] = [Gp,Overlapping]
 78                 #否则,则修改商品数量值为当前值加1
 79                 else:
 80                     Overlapping += 1
 81                     ShopCartDict[Gk] = [Gp,Overlapping]
 82                 #钱包余额
 83                 Wallet[0] += Gp
 84         else:
 85             #输入的序号不在,则继续循环
 86             print("Sorry,You must choose a number in the list !")
 87             continue
 88         #关于是否继续购买的循环
 89         while True:
 90             print("")
 91             ContinueBuy = input("Do you want continue to by y or n: ")
 92             if ContinueBuy == 'y':
 93                 break
 94             elif ContinueBuy == 'n':
 95                 Gbool = False
 96                 break
 97             else:
 98                 print("You Must choos y or n !")
 99     try:
100         #引入登录模块,接受返回值
101         MarketPayTup = CreditCard.Login()
102         #定义余额,消费金额
103         AllMoney = MarketPayTup[2][MarketPayTup[0]][MarketPayTup[1]]['GeneralAccount']
104         SpendMoney = MarketPayTup[2][MarketPayTup[0]][MarketPayTup[1]]['SpendMoney']
105         CardNum = MarketPayTup[0]
106         #如果消费金额小于余额
107         if Wallet[0] <= AllMoney:
108             PrintGcart()
109             #余额等于减去消费金额
110             AllMoney -= Wallet[0]
111             #消费总额等于加上此次消费金额
112             SpendMoney += Wallet[0]
113             MarketPayTup[2][MarketPayTup[0]][MarketPayTup[1]]['GeneralAccount'] = AllMoney
114             MarketPayTup[2][MarketPayTup[0]][MarketPayTup[1]]['SpendMoney'] = SpendMoney
115             #将与额及消费的字典内容存储到文件中
116             pickleFile = open('D:\s12\day05\hw05\pass_file', 'wb')
117             pickle.dump(MarketPayTup[2], pickleFile)
118             pickleFile.close()
119             print(MarketPayTup)
120             #记录购买日志
121             NowTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
122             LogFile = open('D:\s12\day05\hw05\card.log', 'a')
123             for GK2,GP2 in ShopCartDict.items():
124                 OperateContext = "购买%s" %GK2
125                 LogFile.write("\n%s\t%s\t-%s\t%s" % (CardNum, OperateContext, GP2[0], NowTime))
126             LogFile.close()
127         else:
128             print("Sorry, you can not buy these goods,try to modify the shopping cart!")
129             # 如果退出就打印购物车清单并设定循环值为False
130             PrintGcart()
131             #如果金额超出余额,则需要删除上哦
132             ConDel = True
133             while ConDel:
134                 DeleteGoods = input("Which goods do you wanna to delete: ")
135                 print(Wallet[0])
136                 #如果删除商品存在购物车字典里
137                 if DeleteGoods in ShopCartDict.keys():
138                     #如果商品数目等于1,则直接删除商品
139                     if ShopCartDict[DeleteGoods][1] == 1:
140                         ShopCartDict.pop(DeleteGoods)
141                         #金额减去商品的金额
142                         Wallet[0] -= ShopCartDict[DeleteGoods][0]
143                     #否则,对商品数目减去1
144                     else:
145                         ShopCartDict[DeleteGoods][1] -= 1
146                         # 金额减去商品的金额
147                         Wallet[0] -= ShopCartDict[DeleteGoods][0]
148                     #循环是否继续
149                     while True:
150                         print("")
151                         ContinueDel = input("Do you want continue to del y or n: ")
152                         if ContinueDel == 'y':
153                             break
154                         elif ContinueDel == 'n':
155                             ConDel = False
156                             break
157                         else:
158                             print("You Must choos y or n !")
159                 else:
160                     print("%s is not in shopcart,try again." %DeleteGoods)
161                     continue
162                 #打印购物车列表
163                 PrintGcart()
164                 #余额等于减去消费的金额
165                 AllMoney -= Wallet[0]
166                 #消费等于加上消费的金额
167                 SpendMoney += Wallet[0]
168                 MarketPayTup[2][MarketPayTup[0]][MarketPayTup[1]]['GeneralAccount'] = AllMoney
169                 MarketPayTup[2][MarketPayTup[0]][MarketPayTup[1]]['SpendMoney'] = SpendMoney
170                 #文件持久存储
171                 pickleFile = open('D:\s12\day05\hw05\pass_file', 'wb')
172                 pickle.dump(MarketPayTup[2], pickleFile)
173                 pickleFile.close()
174                 # 记录购买日志
175                 NowTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
176                 LogFile = open('D:\s12\day05\hw05\card.log', 'a')
177                 for GK3, GP3 in ShopCartDict.items():
178                     OperateContext = "购买%s" % GK3
179                     LogFile.write("\n%s\t%s\t-%s\t%s" % (CardNum, OperateContext, GP3[0], NowTime))
180                 LogFile.close()
181     except TypeError:
182         pass
183
184 if "__name__" == "__main__":
185     pass

三、logging模块

3.1.日志级别:

CRITICAL = 50 #FATAL = CRITICAL
ERROR = 40
WARNING = 30 #WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0 #不设置

3.2.日志默认级别为warning,默认输出到终端

import logginglogging.debug('--> debug')
logging.info('--> info')
logging.warning('--> warning')
logging.error('--> error')
logging.critical('--> critical')

结果:

3.3.logging全局配置说明

可在logging.basicConfig()函数中通过具体参数来更改logging模块默认行为,可用参数有
filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。#格式
%(name)s:Logger的名字,并非用户名,详细查看%(levelno)s:数字形式的日志级别%(levelname)s:文本形式的日志级别%(pathname)s:调用日志输出函数的模块的完整路径名,可能没有%(filename)s:调用日志输出函数的模块的文件名%(module)s:调用日志输出函数的模块名%(funcName)s:调用日志输出函数的函数名%(lineno)d:调用日志输出函数的语句所在的代码行%(created)f:当前时间,用UNIX标准的表示时间的浮 点数表示%(relativeCreated)d:输出日志信息时的,自Logger创建以 来的毫秒数%(asctime)s:字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒%(thread)d:线程ID。可能没有%(threadName)s:线程名。可能没有%(process)d:进程ID。可能没有%(message)s:用户输出的消息

可在logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有
filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。format参数中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s用户输出的消息

定义全局配置指定打印到文件及格式

import logginglogging.basicConfig(filename='ckl.log',format='%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s',datefmt='%Y-%m-%d %H:%M:%S %p',level=10)logging.debug('--> debug')
logging.info('--> info')
logging.warning('--> warning')
logging.error('--> error')
logging.critical('--> critical')

结果生成ckl.log:

2018-12-01 10:50:54 AM - root - DEBUG - logname: --> debug
2018-12-01 10:50:54 AM - root - INFO - logname: --> info
2018-12-01 10:50:54 AM - root - WARNING - logname: --> warning
2018-12-01 10:50:54 AM - root - ERROR - logname: --> error
2018-12-01 10:50:54 AM - root - CRITICAL - logname: --> critical

3.4.打印日志到指定文件

import loggingformatter1=logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s',datefmt='%Y-%m-%d %H:%M:%S %p')  #定义日志格式

f1=logging.FileHandler('t1.log') #打印内容到指定文件
f2=logging.FileHandler('t2.log')
f3=logging.FileHandler('t3.log')
ch=logging.StreamHandler() #输出到终端

f1.setFormatter(formatter1) #关联日志格式
#f1.setFormatter(formatter2)
f2.setFormatter(formatter1)
f3.setFormatter(formatter1)
ch.setFormatter(formatter1)logger1=logging.getLogger('CKL') #获得日志对象
logger1.setLevel(10)  #设置级别

logger1.addHandler(f1)
logger1.addHandler(f2)
logger1.addHandler(f3)
logger1.addHandler(ch)logger1.debug('----- THIS IS DEBUG')

终端及文件:

日志过滤级别说明

可以在Logger和handles定义日志级别

import loggingformatter1=logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s',datefmt='%Y-%m-%d %H:%M:%S %p')  #定义日志格式

ch=logging.StreamHandler() #输出到终端

ch.setFormatter(formatter1)
ch.setLevel(20) #handler设置日志级别为INFO
logger1=logging.getLogger('CKL') #获得日志对象
logger1.setLevel(10)  #设置级别
logger1.addHandler(ch)logger1.debug('----- THIS IS DEBUG')

日志将不会打印,因为handler的日志级别高于logger的级别,如果都设置为同级别可以打印。

总结:只有高于日志级别的日志才会被打印,logger和handler,都要允许通过才可以。

logging定义范例

"""
logging配置
"""import os
import logging.config# 定义三种日志输出格式 开始

standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \'[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字

simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'# 定义日志输出格式 结束

logfile_dir = os.path.dirname(os.path.abspath(__file__))  # log文件的目录

logfile_name = 'all2.log'  # log文件名# 如果不存在定义的日志目录就创建一个
if not os.path.isdir(logfile_dir):os.mkdir(logfile_dir)# log文件的全路径
logfile_path = os.path.join(logfile_dir, logfile_name)# log配置字典
LOGGING_DIC = {'version': 1,'disable_existing_loggers': False,'formatters': {'standard': {'format': standard_format},'simple': {'format': simple_format},},'filters': {},'handlers': {#打印到终端的日志'console': {'level': 'DEBUG','class': 'logging.StreamHandler',  # 打印到屏幕'formatter': 'simple'},#打印到文件的日志,收集info及以上的日志'default': {'level': 'DEBUG','class': 'logging.handlers.RotatingFileHandler',  # 保存到文件'formatter': 'standard','filename': logfile_path,  # 日志文件'maxBytes': 1024*1024*5,  # 日志大小 5M'backupCount': 5,'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },},'loggers': {#logging.getLogger(__name__)拿到的logger配置'': {'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕'level': 'DEBUG','propagate': True,  # 向上(更高level的logger)传递
        },},
}def load_my_logging_cfg():logging.config.dictConfig(LOGGING_DIC)  # 导入上面定义的logging配置logger = logging.getLogger(__name__)  # 生成一个log实例logger.info('It works!')  # 记录该文件的运行状态if __name__ == '__main__':load_my_logging_cfg()

调用日志配置文件:

import logging
import logging_conflogging_conf.load_my_logging_cfg()

结果:

[2018-12-01 12:54:45,145][MainThread:140735208222720][task_id:logging_conf][logging_conf.py:75][INFO][It works!]

转载于:https://www.cnblogs.com/ckl893/p/6699829.html

第五(模块、包说明)相关推荐

  1. Node.js「一」—— Node.js 简介 / Node.js 模块 / 包 与 NPM

    本文为 Node.js 系列笔记第一篇.文章参考:nodejs 教程 -- 大地:<深入浅出 Node.js>:阮一峰 nodejs 博客 文章目录 一.Node 简介 1. 简单介绍 2 ...

  2. 悟透delphi 第五章 包

    第五章包 我们在日常生活中会用到各式各样的包,钱包.公文包.背包.书包--,包里面都装有经常要用的东西.一旦你那天要出门远行,带上该带的包就可以了.不用再考虑包里面具体的东西,尽管包里有的东西用得着而 ...

  3. Python札记 -- 使用easy_install进行模块/包管理

    今天在阅读以前项目代码时,发现里面使用的第三方模块的参数相当诡异,总是对不上.经过分析之后,发现是自己安装的第三方模块跟项目使用的版本不一致.在Python中进行模块/包管理的话,就不得不提到easy ...

  4. python文件操作和模块_Python(五)--模块与文件操作

    Python(五)–模块与文件操作 模块和包 模块 模块是包含Python定义和语句的文件,把一组相关函数或代码组织到一个文件中,一个文件即一个模块.模块的文件名 = 模块名+后缀.py 模块之间代码 ...

  5. python os库安装_Python模块/包/库安装(6种方法)

    Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一.方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二.方法2: 多文件模块,带s ...

  6. TCP和UDP DNS DHCP OSPF的五种包:

    TCP和UDP: 通俗易懂的TCP里面的三次握手以及四次挥手 [网络协议]TCP分段与IP分片 DNS :https://blog.csdn.net/weixin_42859280/article/d ...

  7. python cv2模块安装_Python运行脚本前,自动安装需要的模块包

    在服务器上部署Python程序时,往往需要先安装很多需要的模块包.如果一个一个安装就会出现忘记的情况.或者新增加某个新的模块时,也可能会忘记安装. 这里先讲一下怎么通过Python程序自动安装. 以下 ...

  8. 如何编写Python模块/包?

    本文翻译自:How to write a Python module/package? I've been making Python scripts for simple tasks at work ...

  9. 滴水穿石--Pydoop 架构和模块包介绍

    1. 背景 Hadoop支持Java以及C/C++开发,其中Hadoop Pipes(C++)支持MapReduce,而Hadoop libhdfs(C)支持HDFS的访问.但Python的解决方案仅 ...

  10. python指定版本 安装模块包

    1.电脑中同时存在多个python版本时,指定版本安装模块包 如:指定python3.6版本中安装某包 python3.6 -m  pip install  包名 2.查看不同python版本中 pi ...

最新文章

  1. AI应用落地哪家强?CSDN AI Top 30+案例评选等你来秀!
  2. Read file, CSV read String
  3. 从零开始学_JavaScript_系列(16)——CSSlt;3gt;(文本、对齐、圆角、盒模型、背景)...
  4. listen函数与海量用户同时登陆
  5. win10 安装程序错误,the setup files are corrupted.please obtain a new copy of the program
  6. JAVA学习--面向对象的特征二:继承性
  7. 【生活智慧】005.信守诺言的约束
  8. 计算机进去pe怎么设置用户,电脑密码怎么设置,教您设置电脑开机密码
  9. leetcode516 最长回文子序列
  10. VMware 下Linux无法上网 新增支持WIFI方式 无线连接
  11. PHP json_encode 文本形式数字下标数组导致下标丢失
  12. 总结:OSI七层协议
  13. Modelica学习笔记
  14. 解决linux(centos7)重新安装mysql systemctl start mysqld.service时报错
  15. yocto-poky下目录结构分析
  16. 【pwnable.kr】Toddler‘s Bottle-[collision]
  17. 推荐一些北京的景点(1简单版)
  18. 【虚幻4】从U3D到UE4的转型之路
  19. 引入图标字体的三种方式
  20. phpunit学习第一章

热门文章

  1. html怎么直接修改,如何编辑运行HTML网页文件(HTML编辑工具使用介绍)
  2. python实现对图片的一些简单处理
  3. 类名与样式是否为并列关系
  4. Chemoffice 2018安装教程
  5. win10无法调节屏幕亮度
  6. 《2022数字藏品研究报告》首发,读懂NFT中西方价值捕获的分化之路
  7. YF3-10L溢流阀的制造
  8. 关于运行项目时 vue-pdf 插件依赖报错的问题及解决办法
  9. java.lang.Byte cannot be cast to java.lang.Integer,sql 到 java 类型转换遇到的问题
  10. 7-1 求奇数和 (15 分)本题要求计算给定的一系列正整数中奇数的和。输入格式:输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。输出格式: