在以往我們使用日志,更多的是使用 python 自帶的 logging 模塊,它可以設(shè)置錯(cuò)誤等級(jí)、輸出方式等。
目前成都創(chuàng)新互聯(lián)已為千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、喀左網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
但使用方式相對(duì)比較復(fù)雜,想要更好的使用需要如 log4net 一樣單獨(dú)配置,這在 python 中感覺(jué)不是很優(yōu)雅。
下面介紹一個(gè) python 庫(kù): loguru 。 guru 是印度語(yǔ)中大師的意思, loguru 直譯就是“日志大師”。
如圖 logging 一樣, loguru 也有定義日志等級(jí)。不同的日志等級(jí),輸出效果也不一樣(默認(rèn)的等級(jí)由低到高是 DEBUG 、 INFO 、 WARNING 、 ERROR 、 CRITICAL ,也可以自己使用 level 函數(shù)定義)。
類(lèi)似 logging 中的 logger.addHandler ,loguru統(tǒng)一使用 add 函數(shù)來(lái)管理格式、文件輸出、過(guò)濾等操作,它提供了許多參數(shù)來(lái)實(shí)現(xiàn) logger.addHandler 中的配置更加簡(jiǎn)單方便。
其中 sink 是最重要的參數(shù),可以傳入不同的數(shù)據(jù)類(lèi)型。傳入文件路徑、文件句柄、 sys.stderr 、甚至 logging 模塊的 Handler 如 FileHandler 、 StreamHandler 等,這樣就可以快速實(shí)現(xiàn)自定義的 Handler 配置。
通過(guò)給 remove 方法傳遞 add 方法返回的對(duì)象, 可以刪除 add 方法添加的 sink ,這里的 remove 并不是刪除 test2.log 文件,而是停止向該文件輸出日志,需要需要繼續(xù)記錄日志則需要重新 add 日志文件。
用 rotation 、 retention 、 compression 進(jìn)行日志窗口、更新、壓縮管理。
支持控制臺(tái)輸出添加顏色, 除了基礎(chǔ)色, loguru 甚至允許16進(jìn)制、RGB格式的顏色值和加粗、下劃線等樣式。
使用裝飾器 @logger.catch 可以和 logging 一樣使用 logger.exception 函數(shù)來(lái)記錄異常信息。
使用 exception 方法輸出的異常信息包含堆棧信息和當(dāng)前變量的值,方便問(wèn)題定位。
使用 serialize 可以將日志轉(zhuǎn)換為 JSON 格式, enqueue 可以保證多線程、多進(jìn)程安全。
修改時(shí)間格式。
python的常用內(nèi)置函數(shù)
1.abs() 函數(shù)返回?cái)?shù)字的絕對(duì)值
abs(-40)=40
2. dict() 函數(shù)用于創(chuàng)建一個(gè)字典
dict()
{} ? ? ?#創(chuàng)建一個(gè)空字典類(lèi)似于u={},字典的存取方式一般為key-value
例如u = {"username":"tom", ?"age":18}
3. help() 函數(shù)用于查看函數(shù)或模塊用途的詳細(xì)說(shuō)明
help('math')查看math模塊的用處
a=[1,2,3,4]
help(a)查看列表list幫助信息
4.dir()獲得當(dāng)前模塊的屬性列表
dir(help)
['__call__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
5.min() 方法返回給定參數(shù)的最小值 /參數(shù)可以為序列
a=? min(10,20,30,40)
a
10
6. next() 返回迭代器的下一個(gè)項(xiàng)目
it = iter([1, 2, 3, 4, 5])
next(it)
1
next(it)
2
7. id() 函數(shù)用于獲取對(duì)象的內(nèi)存地址
a=12
id(a)
1550569552
8.enumerate() 函數(shù)用于將一個(gè)可遍歷的數(shù)據(jù)對(duì)象(如列表、元組或字符串)組合為一個(gè)索引序列,同時(shí)列出數(shù)據(jù)和數(shù)據(jù)下標(biāo),一般用在 for 循環(huán)當(dāng)中。
a=["tom","marry","leblan"]
list(enumerate(a))
[(0, 'tom'), (1, 'marry'), (2, 'leblan')]
9. oct() 函數(shù)將一個(gè)整數(shù)轉(zhuǎn)換成8進(jìn)制字符串
oct(15)
'0o17'
oct(10)
'0o12'
10. bin() 返回一個(gè)整數(shù) int 或者長(zhǎng)整數(shù) long int 的二進(jìn)制表示
bin(10)
'0b1010'
bin(15)
'0b1111'
11.eval() 函數(shù)用來(lái)執(zhí)行一個(gè)字符串表達(dá)式,并返回表達(dá)式的值
eval('2+2')
4
12.int() 函數(shù)用于將一個(gè)字符串會(huì)數(shù)字轉(zhuǎn)換為整型
int(3)
3
int(3.6)
3
int(3.9)
3
int(4.0)
4
13.open() 函數(shù)用于打開(kāi)一個(gè)文件,創(chuàng)建一個(gè)file對(duì)象,相關(guān)的方法才可以調(diào)用它進(jìn)行讀寫(xiě)
f=open('test.txt')
14.str() 函數(shù)將對(duì)象轉(zhuǎn)化為適于人閱讀的形式
str(3)
'3'
15. bool() 函數(shù)用于將給定參數(shù)轉(zhuǎn)換為布爾類(lèi)型,如果沒(méi)有參數(shù),返回 False
bool()
False
bool(1)
True
bool(10)
True
bool(10.0)
True
16.isinstance() 函數(shù)來(lái)判斷一個(gè)對(duì)象是否是一個(gè)已知的類(lèi)型
a=5
isinstance(a,int)
True
isinstance(a,str)
False
17. sum() 方法對(duì)系列進(jìn)行求和計(jì)算
sum([1,2,3],5)
11
sum([1,2,3])
6
18. super() 函數(shù)用于調(diào)用下一個(gè)父類(lèi)(超類(lèi))并返回該父類(lèi)實(shí)例的方法。super 是用來(lái)解決多重繼承問(wèn)題的,直接用類(lèi)名調(diào)用父類(lèi)方法
class ? User(object):
? def__init__(self):
class Persons(User):
? ? ? ? super(Persons,self).__init__()
19. float() 函數(shù)用于將整數(shù)和字符串轉(zhuǎn)換成浮點(diǎn)數(shù)
float(1)
1.0
float(10)
10.0
20. iter() 函數(shù)用來(lái)生成迭代器
a=[1,2,3,4,5,6]
iter(a)
for i in iter(a):
... ? ? ? ? print(i)
...
1
2
3
4
5
6
21.tuple 函數(shù)將列表轉(zhuǎn)換為元組
a=[1,2,3,4,5,6]
tuple(a)
(1, 2, 3, 4, 5, 6)
22.len() 方法返回對(duì)象(字符、列表、元組等)長(zhǎng)度或項(xiàng)目個(gè)數(shù)
s = "playbasketball"
len(s)
14
a=[1,2,3,4,5,6]
len(a)
6
23. property() 函數(shù)的作用是在新式類(lèi)中返回屬性值
class User(object):
?def __init__(self,name):
? ? ? ? ? self.name = name
def get_name(self):
? ? ? ? ? return self.get_name
@property
?def name(self):
? ? ? ? ?return self_name
24.type() 函數(shù)返回對(duì)象的類(lèi)型
25.list() 方法用于將元組轉(zhuǎn)換為列表
b=(1,2,3,4,5,6)
list(b)
[1, 2, 3, 4, 5, 6]
26.range() 函數(shù)可創(chuàng)建一個(gè)整數(shù)列表,一般用在 for 循環(huán)中
range(10)
range(0, 10)
range(10,20)
range(10, 20)
27. getattr() 函數(shù)用于返回一個(gè)對(duì)象屬性值
class w(object):
... ? ? ? ? ? ? s=5
...
a = w()
getattr(a,'s')
5
28. complex() 函數(shù)用于創(chuàng)建一個(gè)復(fù)數(shù)或者轉(zhuǎn)化一個(gè)字符串或數(shù)為復(fù)數(shù)。如果第一個(gè)參數(shù)為字符串,則不需要指定第二個(gè)參數(shù)
complex(1,2)
(1+2j)
complex(1)
(1+0j)
complex("1")
(1+0j)
29.max() 方法返回給定參數(shù)的最大值,參數(shù)可以為序列
b=(1,2,3,4,5,6)
max(b)
6
30. round() 方法返回浮點(diǎn)數(shù)x的四舍五入值
round(10.56)
11
round(10.45)
10
round(10.45,1)
10.4
round(10.56,1)
10.6
round(10.565,2)
10.56
31. delattr 函數(shù)用于刪除屬性
class Num(object):
...? ? a=1
...? ? b=2
...? ? c=3.
.. print1 = Num()
print('a=',print1.a)
a= 1
print('b=',print1.b)
b= 2
print('c=',print1.c)
c= 3
delattr(Num,'b')
print('b=',print1.b)
Traceback (most recent call last):? File "", line 1, inAttributeError: 'Num' object has no attribute 'b'
32. hash() 用于獲取取一個(gè)對(duì)象(字符串或者數(shù)值等)的哈希值
hash(2)
2
hash("tom")
-1675102375494872622
33. set() 函數(shù)創(chuàng)建一個(gè)無(wú)序不重復(fù)元素集,可進(jìn)行關(guān)系測(cè)試,刪除重復(fù)數(shù)據(jù),還可以計(jì)算交集、差集、并集等。
a= set("tom")
b = set("marrt")
a,b
({'t', 'm', 'o'}, {'m', 't', 'a', 'r'})
ab#交集
{'t', 'm'}
a|b#并集
{'t', 'm', 'r', 'o', 'a'}
a-b#差集
{'o'}
在學(xué)習(xí)Python的過(guò)程中,有幾個(gè)比較重要的內(nèi)置函數(shù):help()函數(shù)、dir()函數(shù)、input()與raw_input()函數(shù)、print()函數(shù)、type()函數(shù)。
第一、help()函數(shù)
Help()函數(shù)的參數(shù)分為兩種:如果傳一個(gè)字符串做參數(shù)的話,它會(huì)自動(dòng)搜索以這個(gè)字符串命名的模塊、方法等;如果傳入的是一個(gè)對(duì)象,就會(huì)顯示這個(gè)對(duì)象的類(lèi)型的幫助。比如輸入help(‘print’),它就會(huì)尋找以‘print’為名的模塊、類(lèi)等,找不到就會(huì)看到提示信息;而print在Python里是一個(gè)保留字,和pass、return同等,而非對(duì)象,所以help(print)也會(huì)報(bào)錯(cuò)。
第二、dir()函數(shù)
dir()函數(shù)返回任意對(duì)象的屬性和方法列表,包含模塊對(duì)象、函數(shù)對(duì)象、字符串對(duì)象、列表對(duì)象、字典對(duì)象等。盡管查找和導(dǎo)入模塊相對(duì)容易,但是記住每個(gè)模塊包含什么卻不是這么簡(jiǎn)單,您并不希望總是必須查看源代碼來(lái)找出答案。Python提供了一種方法,可以使用內(nèi)置的dir()函數(shù)來(lái)檢查模塊的內(nèi)容,當(dāng)你為dir()提供一個(gè)模塊名的時(shí)候,它返回模塊定義的屬性列表。dir()函數(shù)適用于所有對(duì)象的類(lèi)型,包含字符串、整數(shù)、列表、元組、字典、函數(shù)、定制類(lèi)、類(lèi)實(shí)例和類(lèi)方法。
第三、input與raw_input函數(shù)
都是用于讀取用戶(hù)輸入的,不同的是input()函數(shù)期望用戶(hù)輸入的是一個(gè)有效的表達(dá)式,而raw_input()函數(shù)是將用戶(hù)的輸入包裝成一個(gè)字符串。
第四、Print()函數(shù)
Print在Python3版本之間是作為Python語(yǔ)句使用的,在Python3里print是作為函數(shù)使用的。
第五、type()函數(shù)
Type()函數(shù)返回任意對(duì)象的數(shù)據(jù)類(lèi)型。在types模塊中列出了可能的數(shù)據(jù)類(lèi)型,這對(duì)于處理多種數(shù)據(jù)類(lèi)型的函數(shù)非常有用,它通過(guò)返回類(lèi)型對(duì)象來(lái)做到這一點(diǎn),可以將這個(gè)類(lèi)型對(duì)象與types模塊中定義類(lèi)型相比較。
該篇文章主要是記錄python中操作文件的三個(gè)函數(shù)read(),readline()以及readlines()之間的區(qū)別。
首先先給出結(jié)論:
1.read() 每次讀取整個(gè)文件,它通常將讀取到底文件內(nèi)容放到一個(gè)字符串變量中,也就是說(shuō) .read() 生成文件內(nèi)容是一個(gè)字符串類(lèi)型。
2.readline()每只讀取文件的一行,通常也是讀取到的一行內(nèi)容放到一個(gè)字符串變量中,返回str類(lèi)型。
3.readlines()每次按行讀取整個(gè)文件內(nèi)容,將讀取到的內(nèi)容放到一個(gè)列表中,返回list類(lèi)型。
我的文件內(nèi)容如下:
編寫(xiě)程序如下:
得出結(jié)果如下:
編寫(xiě)程序如下:
得出輸出結(jié)果如下:
編寫(xiě)程序如下:
得到輸出結(jié)果如下: