第二十九天日志和config模块:
1.我们在写文件时会产生一些数据这些数据需要一个文件进行存储,有时我们需要访问这些文件,需要知道这些文件的路径,而confing主要时我们写程序时所放路径的py文件
而configparser适用于配置文件的格式和windows ini的文件类型相似,可以包含一个或者多个节(section),每个节可以有多个参数(键=值或者时键,值)两种方式。
2.怎么用python生成一个这样的文档:
import configparser config1=configparser.ConfigParser() config1['二哥']={ 'python':'niubi', 'dfjkfdj':'sb' #这里面写数据类型时都要以字典的形式 } config1['three']={ 'jfkdjfj':'fjdljfkjl', 'fjkdjfdj1':'fdjkfdjfd' } with open('config.ini','w',encoding='utf-8') as f:#文件的格式是以ini config1.write(f) #写入的方式
结果为
3.对进行config模块内容的读取操作:
import configparser config1=configparser.ConfigParser() print(config1.sections()) config1.read('config.ini',encoding='utf-8') #如果出现中文乱码可以在这里设置格式 print(config1.sections()) #读出组的内容 print(config1['二哥']['python'])#读出组里面的内容 for i in config1['二哥'] : #用循环读出一个组里的内容 print(i,config1['二哥'][i]) 结果为 [] ['二哥', 'three'] niubi python niubi dfjkfdj sb
4.对config进行增删改查操作:
import configparser config1=configparser.ConfigParser() config1.read('config.ini',encoding='utf-8') config1.add_section('yuan')#删除一个section config1.remove_option('二哥','python')#删除一个配置项 config1.remove_section('three') config1.set('yuan','fdkjfj','eee') with open('config.ini','a',encoding='utf-8') as f: config1.write(f)
5.logging模块:可以一键控制·,排错时需要打印很多细节可以帮助我们排错;严重的错误可以记录下来’有一些用户行为无论是否有错都要记录下来
6.logging的几种模式:
import logging logging.debug('debufg message')#排错信息 /低级 logging.info('info message') #正常信息 logging.warning('warning message') #警告信息 logging.error('error message') #错误信息 logging.critical('critical message') #严重错误信息/高级
7.格式化输出的另一种方式:
print('%(key)s'%{'key':'value'}) #另一种格式化输出方式 结果为 value
8.日志中格式化输出的格式:
9.使用configbasic的logging模式程序为
import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s [line:%(lineno)d]%(levelname)s%(message)s', datefmt='%a,%d %b %Y %H:%M:%S', filename='test.log', filemode='a') try: num=int(input('>>>')) except Exception: logging.error('你输入的有误f') 结果为
从上述结果我们不难发现出现了乱码/可以使用下列方法来进行解决:(即basic简单,能做的事情少,中文会出现乱码)
10.使用配置log对象来实现的程序如下:
import logging logger=logging.getLogger() fh=logging.FileHandler('log.log',encoding='utf-8') format=logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s') fh.setFormatter(format) #logger 文件操作要和格式关联 logger.addHandler(fh) try: num=int(input('>>>')) except Exception: logging.error('你输入的有误f')
结果为
也可以以让其输出在屏幕上:
import logging logger=logging.getLogger() fh=logging.FileHandler('log.log',encoding='utf-8')#输出在文件里 sh=logging.StreamHandler()#进行屏幕的显示 format=logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s') fh.setFormatter(format) #logger 文件操作要和格式关联 sh.setFormatter(format) logger.addHandler(fh) logger.addHandler(sh) try: num=int(input('>>>')) except Exception: logging.error('你输入的有误f') 结果为 >>>f 2020-03-02 21:20:35,031 root ERROR 你输入的有误f
11. s='***hello,world**'请使用strip方法去掉字符串中两端的‘*’号
s='***hello,world**' s=s.strip('*') print(s) 结果为2 hello,world
12,用户输入一个任意的数字n求1-n之间所有数字的奇数
range(1,n,2)
13,s=‘hskakhlkshfkskjakf’,请出去字符串s中重复的字母:
s='hskakhlkshfkskjakf' s1='' for i in s: if i not in s1: s1+=i print(s1) 结果为 hskalfj
14,请看下列程序,说出打印出来的值a,b,c分别是什么?
a=10 b=20 def test(a,b): print(a,b) c=test(b,a) print(c) 结果为 20 10 None
s=‘123.33sdhf3424.34fdg323.324’,计算字符串中所有数字的和
import re ret=re.findall('\d+\.?\d*',s) sum=0 for i in ret: sum+=float(i) print(sum) 结果为 C:\pycharm\python.exe D:/python练习程序/第二十九天/practise.py 3870.994
s='123.33sdhf3424.34fdg323.324' import re ret=re.findall('\d+\.?\d*',s) sum1=0 for i in ret: sum1+=round(float(i),2) print(sum1)
15d={'k1':'v1','k2':'[1,2,3]',('k','3'):{1,23,4}}请用程序实现下述功能;
1.输出上述字典中value为列表的key
2.如果字典中的key是一个元组,请输出对应的value值:
d={'k1':'v1','k2':[1,2,3],('k','3'):{1,23,4}} for i in d: if type(d[i]) is list: print(i) if type(i) ==tuple : print(d[i]) 结果为 k2 {1, 4, 23}
16.如果不适用装饰器@wrapper装饰器请在a()之前加以局话,达到相同的效果
def wrapper(func1): def inner(*args,**kwargs): func1() return inner def func(): print('hello,world') a=wrapper(func) #这是加的语句 a() 结果为 hello,world
17.请处理文件中以T开头的所有行,并进行输出
with open('test5.txt',encoding='utf-8') as f: for i in f: if i.startswith('T'): print(i)
18请说出下列程序的输出结果:
def f1(): #第一步 print('funcname1') def f2(): #第二步 print('funcname2') #第六步 return 1 #第七步 def f3(func1):#第三步 ll=func1() #右边第五步 print('func3name') #第八步 return ll #第九步 print(f3(f2)) #括号里面第四步 打印是第十步 结果为 funcname2 func3name 1
19.写出能匹配手机的正则表达式:
ret=re.search('^1[345678]\d{9}')
20.有四个数字,1,2,3,4能组成多少个互不相同且无重复的数字的三位数各是多少:
count=0 for i in range(1,5): for m in range(1,5): for n in range(1,5): if i!=n!=m: count+=1 print(str(i)+str(m)+str(n)) print(count)
21.模拟cs游戏:
人物角色分为警察和匪徒两种,定义为两个类:
所有·的警察角色都是police
每个警察都有自己独立的名字,生命值,武器和性别
每个都可以开枪攻击敌人,攻击目标不能是police
所有的警察角色都是terroist
每个匪徒都有独自名字,生命值,武器,性别
每个都可以攻击敌人,攻击目标不能是terriost
2,实例化一个警察,一个匪徒,警察攻击匪徒,匪徒掉血
3.提取警察类和匪徒类相似的地方定义成一个类
class Person: def __init__(self,name,blood,wuqi,sex): self.name=name self.blood =blood self.wuqi=wuqi self.sex=sex class Wuqi: def __init__(self,name,njd,gjl): self.name=name self.njd=njd self.gjl=gjl class Police(Person): def attack(self,terroist): terroist.blood=terroist.blood-self.wuqi.gjl print('歹徒还剩下%s血量,掉了%s血量'%(terroist.blood,self.wuqi.gjl)) class Terroist(Person): def attack(self,person,wuqi): person.blood=person.blood-self.wuqi.gjl print('歹徒掉了%s血量'%terroist.blood) wuqi_police=Wuqi('抢',10,3) wuqi_terriost=Wuqi('刀',14,2) police=Police('alex',100,wuqi_police,'南') terrist=Terroist('二哥',100,wuqi_terriost,'nan') police.attack(terrist)
`