乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      python3常用標準庫

       行者花雕 2021-05-14

      python3常用標準庫

      趁著有時間,把一些我用過的常用標準庫進行整理和復習。

      time

      用法說明
      time.time()返回時間戳(從1970年1月1日00:00:00開始計算)
      time.localtime()返回當前時間的結(jié)構(gòu)化時間(struct_time)對象,可以用.tm_year等獲取年等數(shù)據(jù)
      time.gmtime()返回世界標準時間的結(jié)構(gòu)化時間(struct_time)對象
      time.mktime(struct_time)結(jié)構(gòu)化時間轉(zhuǎn)化為時間戳
      time.strftime("時間格式", struct_time)結(jié)構(gòu)化時間轉(zhuǎn)化為字符串時間
      time.strptime("字符串時間", "時間格式")字符串時間轉(zhuǎn)化為結(jié)構(gòu)化時間
      time.asctime([tuple])時間元組轉(zhuǎn)換為字符串。如果時間元組不存在,則使用localtime()返回的當前時間
      time.ctime(seconds)將時間秒數(shù)轉(zhuǎn)換為時間字符串,相當于time.asctime(localtime(seconds))。second不存在,則使用localtime()返回的當前時間。

      常用時間占位符

      • 年 %Y

      • 月 %m

      • 日 %d

      • 時 %H (24小時制)

      • 分 %M

      • 秒 %S

      • 時分秒 %X ,相當于%H:%M:%S

      time庫各方法關系
      time庫各方法關系

      datetime

      雖然python庫中已經(jīng)有了time庫,但time庫不支持對時間的加減等操作,因此就有了datetime庫。

      用法說明
      datetime.datetime.now()獲取當前時間,返回datetime.datetime對象,有year, month, day, hour, minute, second, microsecond等屬性。
      datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0這是一個類,表示兩個 date 或者 time 的時間間隔。
      datetime.datetime.fromtimestamp(seconds)將秒數(shù)轉(zhuǎn)換為datetime.datetime對象,datetime.datetime.fromtimestamp(time.time())<==>datetime.datetime.now()
      datetime.timetuple()這是datetime.datetime對象的方法,返回結(jié)構(gòu)化時間,time.localtime() 的返回類型相同
      datetime.replace(year=self.year, month=.., day=.., hour=.., minute=.., second=.., ...)一樣是datetime.datetime對象的方法,可以替換當前對象的year等屬性,詳見文檔

      有了以上幾個方法,我們就可以對時間進行加減操作,并可以在time和datetime之間進行轉(zhuǎn)換。

      • datetime.datetime之間可以相減,結(jié)果為datetime.timedelta對象,有days和seconds屬性

      • datetime.datetime與datetime.timedelta之間可以加減,結(jié)果為datetime.datetime對象

      • datetime.timedelta本身可以乘以一個數(shù),以表示不同的時間間隔

      import timeimport datetimedef main():
          date1_string = "2017/6/8 15:0:0"
          # date1_string轉(zhuǎn)換為時間戳# strptime -> mktime -> fromtimestamp ==> datetime.datetime
          date1 = datetime.datetime.fromtimestamp(time.mktime(
              time.strptime(date1_string, '%Y/%m/%d %H:%M:%S')))
      
          date2 = datetime.datetime.now()# 獲取當前時間
      
          # 使用datetime.datetime對象之間 進行操作,結(jié)果為datetime.timedelta對象
          result1 = date2 - date1# 兩個時間過了多久了
          print(result1.days, result1.seconds)    # datetime.datetime與datetime.timedelta之間的操作, 結(jié)果是datetime.datetime對象
          year = datetime.timedelta(days=365)     # 一年時間
      
          result2 = date2 + 2 * year# 當前時間的兩年后
          print(result2.year, result2.month, result2.day)if __name__ == '__main__':
          main()

      random

      使用random可以生成偽隨機數(shù)。

      用法說明
      random.seek(time.time())初始化隨機數(shù)生成器
      random.random()生成[0.0, 1.0) 范圍內(nèi)的一個隨機浮點數(shù)
      random.uniform(num1, num2)返回[num1, num2] [1] 中一個隨機浮點數(shù)
      random.randint(num1, num2)生成[num1, num2] 范圍內(nèi)的一個整數(shù),num1, num2均為int
      random.randrange(num1, num2)生成[num1, num2) 范圍內(nèi)的一個整數(shù),num1, num2均為int
      random.choice(iterable_obj)從可迭代對象中隨機取一個元素
      random.sample(iterable_obj, n)從可迭代對象中隨機取n個元素組成一個列表返回
      random.shuffle(x)將序列 x 隨機打亂位置。不可變的可以用random.sample(x, k=len(x))

      生成驗證碼例子:

      import randomdef make_code(n):
          res = ''
          for i in range(n):
              letter = chr(random.randint(65, 90))# 生成A-Z的任意一個字母
              number = str(random.randint(0, 9))# 生成0-9的任意一個數(shù)
              res += random.choice([letter, number])    return res
      
      print(make_code(9))

      sys

      sys模塊提供了一些與解釋器相關的變量和函數(shù)。

      用法說明
      sys.argv返回一個列表,第一個元素是程序本身路徑,其他元素是命令行輸入?yún)?shù)
      sys.exit(n)退出程序,實現(xiàn)方式是拋出一個SystemExit異常。正常時n為0,非零值視為“異常終止”。大多數(shù)系統(tǒng)要求該值的范圍是 0~127。
      sys.path返回模塊的搜索路徑,其本質(zhì)上是列表,可以使用append方法添加路徑,導入特定模塊。
      sys.platform返回平臺名稱(Linux:'linux',Windows:'win32',Mac OS X:darwin')
      sys.stdout.write(" ")不換行打印
      sys.stdout.flush()刷新

      os

      一般用于對文件和目錄進性操作的模塊。

      路徑相關

      os.getcwd() 獲取當前工作目錄
      os.chdir(path) 改變當前工作目錄

      文件/目錄操作

      用法說明
      os.mkdir(path)創(chuàng)建目錄
      os.makedirs(path)遞歸創(chuàng)建目錄
      os.redir(path)刪除空目錄
      os.removedirs(path)遞歸刪除空目錄
      os.remove(path)刪除文件
      os.rename(old_name, new_name)更改文件或目錄名
      os.stat(path)查看文件詳情( 'st_atime', 'st_ctime', 'st_mtime', 'st_size'等)

      輸出符號

      用法說明
      os.sep輸出系統(tǒng)分隔符(如:\/
      os.linesep輸出行終止符(win:\r\n,linux:\n)
      os.pathsep輸出路徑分割符(win:;,linux::

      path

      path是os庫中的一個模塊,里面有很多實用的函數(shù)。

      用法說明
      os.path.split(path)把路徑分割為(目錄, 文件名)
      os.path.abspath(path)返回path規(guī)范化的絕對路徑
      os.path.normpath(path)返回path規(guī)范化后的結(jié)果
      os.path.dirname(path)split結(jié)果的個第一元素
      os.path.basername(path)split結(jié)果的個第二元素
      os.path.join(path1, path2, path3 ...)把多個路徑拼接成一個,并返回
      os.path.exists(path)判斷路徑是否存在
      os.path.isabs(path)判斷路徑是否為絕對路徑
      os.path.isfile(path)判斷路徑是否為文件
      os.path.isdir(path)判斷路徑是否為目錄
      os.path.getatime(path)返回文件/目錄的最后訪問時間。返回值是一個浮點數(shù),為紀元秒數(shù)
      os.path.getctime(path)返回文件/目錄的最后修改時間。返回值是一個浮點數(shù),為紀元秒數(shù)
      os.path.getmtime(path)Unix:返回元數(shù)據(jù)的最后修改時間,Win:返回創(chuàng)建時間。返回值是一個數(shù),為紀元秒數(shù)
      os.path.size(path)返回文件/目錄的大小,以字節(jié)為單位

      shutil

      shutil模塊提供了一系列對文件和文件集合的高階操作。 特別是提供了一些支持文件拷貝和刪除的函數(shù)。

      拷貝操作

      1. shutil.copyfileobj(fsrc, fdst[, length])
        將文件類對象 fsrc 的內(nèi)容拷貝到文件類對象 fdst,length表示緩沖區(qū)大小,且默認情況為:1024 * 1024 if WINDOWS else 64 * 1024。

        import shutil
        
        
        shutil.copyfileobj(open("./t1/a.txt", "r"), open("t1/b.txt", "w"))

        注意有個fsrc是讀,而fdst是寫

      2. shutil.copyfile(src, dst)
        將src文件拷貝到dst文件,dst可以不存在

        import shutil
        
        
        shutil.copyfile("./t1/a.txt", "./t1/b.txt")
      3. shutil.copymode(src, dst)
        僅拷貝權限。內(nèi)容、組、用戶均不變,此功能并不是在所有平臺上均可用(查看文檔,了解更多)

        import shutil
        
        
        shutil.copymode("./t1/a.txt", "./t1/b.txt")
      4. shutil.copystat(src, dst)
        從 src 拷貝權限位、最近訪問時間、最近修改時間以及旗標到 dst.

      5. shutil.copy(src, dst)
        拷貝文件和權限

      6. shutil.copy2(src, dst)
        拷貝文件和狀態(tài)信息

      7. shutil.copytree(src, dst)
        遞歸拷貝,參數(shù)很多,沒有詳細列出

        import shutil
        
        shutil.copytree('folder1', 'folder2',
        ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))# 目標目錄不能存在,注意對folder2目錄父級目錄要有可寫權限,ignore的意思是排除

      刪除操作

      • shutil.rmtree(path, ignore_errors=False, onerror=None)
        遞歸刪除文件夾。前面說過:空文件夾用os.redir(path),單個文件用os.remove(path);onerror參數(shù)可以指定處理程序來處理異常(ignore_errors為False時)

      移動操作

      • shutil.move(src, dst)
        遞歸地將一個文件或目錄 (src) 移至另一位置 (dst) 并返回目標位置。同一目錄時為重命名,類似于mv命令。

      json

      json模塊可以把python基本數(shù)據(jù)類型與json數(shù)據(jù)進行轉(zhuǎn)換。

      • json.dumps(data)
        將基本數(shù)據(jù)類型格式轉(zhuǎn)換為json數(shù)據(jù)

        import json
        
        data = {"name": "lczmx","age": 20,
        }
        
        s = json.dumps(data)
        
        print(repr(s))  # '{"name": "lczmx", "age": 20}'
      • json.dump(data, file_obj)
        將基本數(shù)據(jù)類型轉(zhuǎn)換為json數(shù)據(jù)并寫入到文件中

        import json
        
        data = {"name": "lczmx","age": 20,
        }
        f = open("./res.json", "w", encoding="utf-8")
        json.dump(data, f)
        
        f.close()
      • json.loads(s)
        把json字符串轉(zhuǎn)化為python數(shù)據(jù)類型

        import json
        
        s = '{"name": "lczmx", "age": 20}'res = json.loads(s)
        
        print(res, type(res))# {'name': 'lczmx', 'age': 20} <class 'dict'>
      • json.load(file_obj)
        轉(zhuǎn)換文件對象的json內(nèi)容。

        import jsonwith open("./res.json", "r", encoding="utf-8") as f:
        res = json.load(f)
        
        print(res, type(res))

      擴展json

      json模塊只支持python基本數(shù)據(jù)類型,但我們可以自定義JSON編碼器,重寫default方法,這樣我們自己寫的類就可以使用json.dumps

      import jsonclass Foo:
          def __init__(self, name, age):
              self.name = name
              self.age = age    def data_dict(self):
              # 返回的是基本數(shù)據(jù)類型
              return {"name": self.name, "age": self.age}class JsonCustomEncoder(json.JSONEncoder):
          # 重寫default方法
          def default(self, field):
              if isinstance(field, Foo):            return field.data_dict()    # 調(diào)用自定義的方法
              else:            return json.JSONEncoder.default(self, field)
      
      
      f = Foo("lczmx", 21)# 使用時要指定自定義的編碼器res = json.dumps(f, cls=JsonCustomEncoder)
      print(res)# {"name": "lczmx", "age": 21}

      pickle

      模塊 pickle 實現(xiàn)了對一個 Python 對象結(jié)構(gòu)的二進制序列化和反序列化。它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的數(shù)據(jù),不能成功地反序列化也沒關系。

      注意:pickle 模塊并不安全。你只應該對你信任的數(shù)據(jù)進行unpickle操作.

      import pickle
      
      dic = {'name': 'alvin', 'age': 23, 'sex': 'male'}
      
      print(type(dic))  # <class 'dict'>j = pickle.dumps(dic)
      print(type(j))  # <class 'bytes'>f = open('序列化對象_pickle', 'wb')  # 注意是w是寫入str,wb是寫入bytes,j是'bytes'f.write(j)  # -------------------等價于pickle.dump(dic,f)f.close()# -------------------------反序列化f = open('序列化對象_pickle', 'rb')
      
      data = pickle.loads(f.read())  # 等價于data=pickle.load(f)print(data['age'])

      shelve

      shelve" 是一種持久化的類似字典的對象,只有open方法,比pickle簡單。
      由于 shelve 模塊需要 pickle 的支持,所以shelve模塊也不安全。需要注意是否為信任數(shù)據(jù)才能使用。

      import shelve
      
      d = shelve.open("持久化文件.txt")# 以 d[key] = data 的形式存儲d["name"] = "lczmx"d["age"] = 22d["addr"] = "guangzhou"d["data"] = [1, 2, 3]# 使用中括號取值name = d["name"]
      print(name)         # lczmx# 使用del刪除某個鍵對應的值del d["age"]# 可以使用 in 判斷某個鍵是否存在flag = "age" in d
      print(flag)         # False# .keys()方法 可以列出所有的鍵 (速度較慢!)klist = list(d.keys())
      print(klist)        # ['name', 'addr', 'data']# 值即使是引用對象,假如要保存修改后的值,要重新賦值temp = d['data']
      temp.append(4)
      print(d["data"])    # [1, 2, 3]d['data'] = temp
      print(d["data"])    # [1, 2, 3, 4]# close掉,可以使用上下文管理協(xié)議d.close()

      xml

      xml也是一個可以跨語言的數(shù)據(jù)交換協(xié)議,但使用起來沒有json簡單,由于xml誕生的時間比json早,所以至今還有一些公司正在使用。

      生成xml

      步驟:

      1. 創(chuàng)建根節(jié)點

      2. 為根節(jié)點添加子節(jié)點

      3. 為字節(jié)點添加內(nèi)容和屬性

      4. 生成文檔對象樹

      5. 保存到文件等

      import xml.etree.ElementTree as ET# 創(chuàng)建根節(jié)點new_xml = ET.Element("namelist")# 為跟節(jié)點創(chuàng)建字節(jié)點name1 = ET.SubElement(new_xml, "name", attrib={"enrolled": "yes"})
      age1 = ET.SubElement(name1, "age", attrib={"checked": "no"})# 添加內(nèi)容name1.text = '老王'age1.text = "30"# 同上name2 = ET.SubElement(new_xml, "name", attrib={"enrolled": "no"})
      age2 = ET.SubElement(name2, "age")
      name2.text = "隔壁"age2.text = '33'# 生成文檔對象et = ET.ElementTree(new_xml)# 寫入文件中et.write("test.xml", encoding="utf-8", xml_declaration=True)# 打印生成的格式ET.dump(new_xml)

      結(jié)果:

      <?xml version='1.0' encoding='utf-8'?><namelist>
          <name enrolled="yes">老王<age checked="no">30</age></name>
          <name enrolled="no">隔壁<age>33</age></name></namelist>

      讀取xml

      對xml文件進行操作,用的是parse方法和getroot方法

      import xml.etree.ElementTree as ET
      
      
      tree = ET.parse("./test.xml")
      root = tree.getroot()

      以下都以root即根節(jié)點這個對象進行操作
      root可以換成任意子節(jié)點

      查看

      • root.tag 獲取標簽名

      • root.attrib 獲取屬性

      • root.text 獲取內(nèi)容

      遍歷/查找

      • root.iter(tag) 查找子孫節(jié)點中的tag標簽,以迭代器方式返回

      • root.find(tag) 查找子節(jié)點的第一個tag標簽

      • root.findall(tag) 找子節(jié)點的所有tag標簽

      修改

      • root.text="xx" 修改內(nèi)容

      • root.set("屬性名", "屬性值") 設置屬性值

      刪除

      • root.remove(node) 刪除子節(jié)點

      struct

      此模塊可以執(zhí)行 Python 值和以 Python bytes 對象表示的 C 結(jié)構(gòu)之間的轉(zhuǎn)換。 這可以被用來處理存儲在文件中或是從網(wǎng)絡連接等其他來源獲取的二進制數(shù)據(jù)。
      一般使用它的兩個函數(shù):

      1. struct.pack("格式", data)

      2. struct.unpack("格式", byte_data)

      import struct# 數(shù)據(jù) -> bytespi = 3.14159265358res = struct.pack("f", pi)
      print(res, type(res))  # b'\xdb\x0fI@' <class 'bytes'> # 已經(jīng)轉(zhuǎn)化為字節(jié)類型# bytes -> 原數(shù)據(jù)data = struct.unpack("f", res)
      print(data, type(data))  # (3.1415927410125732,) <class 'tuple'>
      格式C 類型Python 類型標準大小注釋
      x填充字節(jié)

      cchar長度為 1 的字節(jié)串1
      bsigned char整數(shù)1(1), (2)
      Bunsigned char整數(shù)1(2)
      ?_Boolbool1(1)
      hshort整數(shù)2(2)
      Hunsigned short整數(shù)2(2)
      iint整數(shù)4(2)
      Iunsigned int整數(shù)4(2)
      llong整數(shù)4(2)
      Lunsigned long整數(shù)4(2)
      qlong long整數(shù)8(2)
      Qunsigned long long整數(shù)8(2)
      nssize_t整數(shù)
      (3)
      Nsize_t整數(shù)
      (3)
      e(6)浮點數(shù)2(4)
      ffloat浮點數(shù)4(4)
      ddouble浮點數(shù)8(4)
      schar[]字節(jié)串

      pchar[]字節(jié)串

      Pvoid *整數(shù)
      (5)

      re

      正則表達式是用來描述字符或字符串的特殊符號,在python中用re模塊實現(xiàn),正則表達式模式被編譯成一系列的字節(jié)碼,用 C 編寫的匹配引擎執(zhí)行。

      元字符

      正則表達式語言由兩種基本字符類型組成:原義(正常)文本字符和元字符,元字符實質(zhì)上就是有特殊含義的字符。
      下面列舉一些常用的元字符,參考文檔給出的元字符

      字符描述列子
      \\匹配\
      \w匹配字母、數(shù)字、下劃線
      \W匹配非字母數(shù)字下劃線
      \s匹配空白字符
      \S匹配非空白字符
      \d匹配數(shù)字
      \D匹配非數(shù)字
      \n匹配換行符
      \t匹配制表符
      ^匹配字符串的開頭
      $匹配字符串的結(jié)尾
      .匹配除換行符外的所有字符,當re.DOTALL標記被指定時,可以匹配換行符
      []匹配括號中的每一個字符,如[abc]表示ab、c
      [^]匹配不在括號中的字符,如[^abc]表示不是ab
      *對它前面的正則式匹配0到任意次重復,如\w*表示0到任意個數(shù)字
      +對它前面的正則式匹配1到任意次重復
      ?對它前面的正則式匹配0到1次重復
      {n}對其之前的正則式指定匹配 m 個重復;少于 m 的話就會導致匹配失敗,如\w{6}表示6個數(shù)字
      {n,m}對正則式進行 n 到 m 次匹配,在 n 和 m 之間取盡量多。
      a|b匹配a或b
      ()組合,匹配括號內(nèi)的表達式

      更多可以看這篇文章 linux shell 正則表達式(BREs,EREs,PREs)差異比較
      關于(?…)個擴展標記法,可以看官方文檔。

      方法

      查找

      使用說明
      re.findall(pattern, string)匹配所有結(jié)果,返回一個列表,空匹配也會包含在結(jié)果里
      re.finditer(pattern, string)匹配所有結(jié)果,返回由匹配對象(re.Match)構(gòu)成的迭代器 。 string 從左到右掃描,匹配按順序排列??掌ヅ湟舶诮Y(jié)果里。
      re.search(pattern, string)匹配第一個結(jié)果,返回匹配對象(re.Match),未匹配到時為None
      re.match(pattern, string)字符串開頭相當于re.search("^ ...", string)是否匹配pattern,是則返回匹配對象(re.Match),未匹配到時為None

      分割

      • re.split(pattern, string, maxsplit=0, flags=0)
        以pattern規(guī)則分割string,結(jié)果以列表形式返回,maxsplit非零時,表示分割多少次,flags=re.IGNORECASE可以忽略大小寫

        import re
        
        
        s = "12a21v13xsa15"res = re.split("[a-z]+", s)
        
        print(res)      # ['12', '21', '13', '15']

      替換

      • re.sub(pattern, repl, string, count=0, flags=0)
        返回通過使用 repl 替換在 string 最左邊非重疊出現(xiàn)的 pattern 而獲得的字符串。
        可選參數(shù) count 是要替換的最大次數(shù);count 必須是非負整數(shù)。如果省略這個參數(shù)或設為 0,所有的匹配都會被替換。

        import re
        
        s = "12a21v13xsa15"res = re.sub("[a-z]+", ", ", s)
        
        print(res)  # 12, 21, 13, 15

        假如repl參數(shù)是一個函數(shù),那么可以極大擴展替換功能。

        import re
        
        
        s = "name=lczmx, age=22"def repl_func(matchobj):age = int(matchobj.group("age"))return str(age + 1)
        
        
        res = re.sub(r"(?P<age>\d+)", repl_func, s)
        print(res)      # name=lczmx, age=23

      匹配對象(re.Match)操作

      • Match.group([group1, ...])
        返回一個或者多個匹配的子組。如果只有一個參數(shù),結(jié)果就是一個字符串,如果有多個參數(shù),結(jié)果就是一個元組,使用正則表達式使用了(?P<name>…) 語法,可以用Match.group("name")的方式取值。

      • Match.groups(default=None)
        返回一個元組,包含所有匹配的子組

      • Match.groupdict(default=None)?
        返回一個字典,包含了所有的命名子組。key就是組名

        import re
        
        s = "abc@example.com,user"res = re.match(r"([a-zA-Z]+)@(\w+\.com)", s)
        
        
        print(res.groups())  # ('abc', 'example.com')print(res.group(0))  # abc@example.comprint(res.group(1))  # abcprint(res.group(2))  # example.comres = re.match(r"(?P<prefix>\w+)@(?P<suffix>\w+\.com)", s)
        
        print(res.groups())  # ('abc', 'example.com')print(res.group(0))  # abc@example.comprint(res.group(1))  # abcprint(res.group("prefix"))  # abcprint(res.group(2))  # example.comprint(res.group("suffix"))  # example.comprint(res.groupdict())  # {'prefix': 'abc', 'suffix': 'example.com'}

      去括號優(yōu)先級
      假如這樣的例子:

      import re
      
      
      res = re.findall(r"(abc)+", "abcabcabc")
      print(res)      # ['abc']

      其匹配結(jié)果是["abc"],而非["abcabcabc"],這是因為括號的優(yōu)先級高,假如要括號與后面的元字符相結(jié)合的化可以使用以下方法:

      import re
      
      
      res = re.findall(r"(?:abc)+", "abcabcabc")
      print(res)      # ['abcabcabc']

      匹配原理
      關于正則匹配原理,看此文。

      logging

      關于日志管理的基本教程,請點擊這里

      關于使用日志的流程,大約有以下步驟:

      1. 調(diào)用logging.basicConfig()設置logging,確定日記級別、是否輸入到文件、信息格式等參數(shù)

      2. 根據(jù)需求,調(diào)用loggingdebug、info、warningerror、critical方法

      注意
      由于logging.basicConfig()只需要定義一次,所以debug等方法應該在其被設置后調(diào)用

      打印到終端

      打印到終端是開發(fā)過程中的一個實用的方法。

      import logging
      
      
      logging.basicConfig()
      
      logging.debug("debug messages")
      logging.info("info messages")
      logging.warning("warning messages")
      logging.error("error messages")
      logging.critical("critical messages")

      由于默認日志級別為WARNING,所以只在終端顯示了后三行信息

      寫入文件

      basicConfig()增加filename參數(shù)即可

      import logging
      
      
      logging.basicConfig(filename="test.log")
      
      logging.debug("debug messages")
      logging.info("info messages")
      logging.warning("warning messages")
      logging.error("error messages")
      logging.critical("critical messages")

      python 3.9版本的logging.basicConfig() 可以指定encoding參數(shù),之前的以系統(tǒng)默認的編碼方式打開。

      多模塊使用

      在多個模塊中import logging即可,其操作的是同一個logging對象

      import loggingimport mylibdef main():
      
          logging.basicConfig()
          logging.warning("start function")
          mylib.my_func()
          logging.warning("end function")
          print(id(logging))# 2248755624272if __name__ == '__main__':
          main()

      ./mylib.py

      # ./mylib.pyimport loggingdef my_func():
          logging.error("error massage")
          print(id(logging))# 2248755624272

      修改日志級別

      日志級別從低到高:

      級別何時使用
      DEBUG細節(jié)信息,僅當診斷問題時適用。
      INFO確認程序按預期運行
      WARNING表明有已經(jīng)或即將發(fā)生的意外(例如:磁盤空間不足)。程序仍按預期進行
      ERROR由于嚴重的問題,程序的某些功能已經(jīng)不能正常執(zhí)行
      CRITICAL嚴重的錯誤,表明程序已不能繼續(xù)執(zhí)行

      默認級別為WARNING

      修改日志級別要用到logging.basicConfig()level參數(shù),其傳入的值是一個在logging模塊中已經(jīng)被定義好的數(shù):

      CRITICAL = 50FATAL = CRITICAL
      ERROR = 40WARNING = 30WARN = WARNING
      INFO = 20DEBUG = 10NOTSET = 0

      例子:

      import logging
      
      
      logging.basicConfig(level=logging.INFO)
      logging.warning("start function")

      從命令行中接收日志級別

      使用argparse庫接收命令行參數(shù),再使用getattr()方法從logging模塊中把對應的日志級別取出來:

      import loggingimport argparse# log選項的值只能是level_list的元素level_list = ["debug", "info", "warning", "warn", "error", "fatal", "critical"]
      level_list.extend(list(map(lambda x: x.upper(), level_list)))# 全大寫再加入parser = argparse.ArgumentParser(description="test file")
      
      parser.add_argument("--log", default="debug", choices=level_list)
      
      args = parser.parse_args()# 拿到級別字符串后要大寫level = getattr(logging, args.log.upper())
      logging.basicConfig(level=level)
      
      logging.debug("debug messages")
      logging.info("info messages")
      logging.warning("warning messages")
      logging.error("error messages")
      logging.critical("critical messages")
      $ python test.py --log error
      ERROR:root:error messages
      CRITICAL:root:critical messages
      
      $ python test.py --log info 
      INFO:root:info messages
      WARNING:root:warning messages
      ERROR:root:error messages
      CRITICAL:root:critical messages

      configparser

      configparser庫是python的配置文件管理模塊,其所用結(jié)構(gòu)與 INI 文件的類似。
      注意:小節(jié)(section)中的鍵(key)大小寫不敏感并且會存儲為小寫形式

      步驟:

      1. 創(chuàng)建對象configparser.ConfigParser()

      2. 在字典中添加數(shù)據(jù),用中括號操作,類似字典

      3. 寫入文件

      import configparser# 1 創(chuàng)建parser對象config = configparser.ConfigParser()# 2 添加數(shù)據(jù)# 方法一config["DEFAULT"] = {"HOST": "localhost", "PORT": "3306"}# 方法二config["CUSTOM"] = {}
      config["CUSTOM"]["HOST"] = "192.168.0.1"# 或custom_config = config["CUSTOM"]
      custom_config["PORT"] = "3333"# 3 寫入文件with open("config.ini", "w") as f:
          config.write(f)

      最外層就是一個字典

      config.ini文件:

      [DEFAULT]host = localhostport = 3306[CUSTOM]host = 192.168.0.1port = 3333

      注意:DEFAULT不在sections()中,可以直接用["DEFAULT"].get(key).get("DEFAULT", key)取值
      根據(jù)不同的需求可以用以下幾個方法:

      • config.read(path) 讀取配置文件

      • config.sections() 返回可用節(jié)的列表,即[xxx]中的xxx

      • config.options(Section) 返回鍵構(gòu)成的元組

      • config.items(Section) 返回列表,元素為鍵值對組成的元組

      • config.get(Section, key) 等價于 Section.get(key)

      • Section.get(key, default) 類似字典一樣取值

        config 還可以通過使用for循環(huán),有.keys(), .values(), .items()

        import configparser
        
        config = configparser.ConfigParser()
        
        config.read("./config.ini")
        
        print(config["DEFAULT"].get("host"))    # localhostprint(config.options("CUSTOM"))  # ['host', 'port']print(config.items("CUSTOM"))# [('host', '192.168.0.1'), ('port', '3333')]

      刪操作

      • config.remove_section(section) 刪除塊即整個[xxx]

      • config.remove_option(section, key) 刪除塊下面的鍵(包括值)

        import configparser
        
        config = configparser.ConfigParser()
        
        config.read("./config.ini")
        
        config.remove_section("CUSTOM")
        config.remove_option("DEFAULT", "host")
        config.write(open("./config.ini", "w"))

      argparse

      argparse是python推薦的命令行參數(shù)解析模塊,argparse基于optparse(3.2版中已經(jīng)被棄用),所以兩者用法類似。
      其一般的使用步驟是:

      1. 創(chuàng)建解析器

      2. 添加參數(shù)

      3. 解析參數(shù)

      創(chuàng)建解析器

       parser = argparse.ArgumentParser(description="計算兩個數(shù)的和", prog="SUM")
      • description參數(shù)可以指定幫助文檔之前顯示的描述信息

      • prog 指定程序名,默認sys.argv[0]

      添加參數(shù)

      使用parser.add_argument(name or flags)方法,該方法可以指定位置參數(shù)或者是選項,而且它可以接收很多參數(shù),下面列舉幾個常用的參數(shù):

      • action - 當參數(shù)在命令行中出現(xiàn)時使用的動作基本類型。
        它的值列出這幾個更多可以看文檔

        action值說明
        store存儲參數(shù)的值(默認)
        store_true and store_false分別用作存儲 True 和 False 值的特殊用例
        version期望有一個 version= 命名參數(shù),version參數(shù)可以用%(prog)s的形式使用prog參數(shù)
      • default - 設置默認值。

      • type - 命令行參數(shù)應當被轉(zhuǎn)換成的類型,即把str轉(zhuǎn)成其他形式。

      • choices - 可用的參數(shù)的容器(一般為列表),即參數(shù)值只能是里面的元素。

      • required - 此命令行選項是否必需,默認False
        (一般來說選項是可以被省略的,不然換為位置參數(shù)更好)。

      • help - 為此選項作用的簡單描述,使用-h或--help可以看到。

      parser.add_argument("x", type=float, help="一個數(shù)x")        # 添加位置參數(shù)xparser.add_argument("y", type=float, help="一個數(shù)y")        # 添加位置參數(shù)y# 添加選項-a, 把值存儲為Trueparser.add_argument("-a", action="store_true", help="顯示詳細過程")# 添加選項-f,它的值知道能是[1, 2, 3]中的元素parser.add_argument("-f", default=1, choices=[1, 2, 3],
                          type=int, help="保留小數(shù)點位數(shù)")# 添加選項-v 或 --version# 使用來自argparse.ArgumentParser的prog參數(shù)parser.add_argument("-v", "--version", action="version",
                          version="%(prog)s 0.1", help="顯示版本")

      解析參數(shù)

      通過parser.parse_args()解析,然后通過.的方式取值(無論位置參數(shù)還是選項)

      # 解析args = parser.parse_args()
      print(args.x)
      print(args.a)
      print(args.f)

      完整例子

      一個計算兩個數(shù)和的程序

      import argparse
      
      parser = argparse.ArgumentParser(description="計算兩個數(shù)的和", prog="SUM")
      
      parser.add_argument("x", type=float, help="一個數(shù)x")        # 添加位置參數(shù)xparser.add_argument("y", type=float, help="一個數(shù)y")        # 添加位置參數(shù)y# 添加選項-a, 把值存儲為Trueparser.add_argument("-a", action="store_true", help="顯示詳細過程")# 添加選項-f,它的值知道能是[1, 2, 3]中的元素parser.add_argument("-f", default=1, choices=[1, 2, 3],
                          type=int, help="保留小數(shù)點位數(shù)")# 添加選項-v 或 --version# 使用來自argparse.ArgumentParser的prog參數(shù)parser.add_argument("-v", "--version", action="version",
                          version="%(prog)s 0.1", help="顯示版本")# 解析args = parser.parse_args()# 計算并保留小數(shù)res = round(args.x + args.y, args.f)if args.a:
          print("{x} + {y} = {res}".format(x=args.x, y=args.y, res=res))else:
          print(res)

      在命令行中使用:

      $ python get_sum.py -h
      usage: SUM [-h] [-a] [-f {1,2,3}] [-v] x y
      
      計算兩個數(shù)的和
      
      positional arguments:
        x              一個數(shù)x
        y              一個數(shù)y
      
      optional arguments:
        -h, --help     show this help message and exit
        -a             顯示詳細過程
        -f {1,2,3}     保留小數(shù)點位數(shù)
        -v, --version  顯示版本
      
      
      $ python get_sum.py -v
      SUM 0.1
      
      
      $ python get_sum.py 3.14 5.96
      9.1
      
      $ python get_sum.py 3.14 5.96 -a
      3.14 + 5.96 = 9.1
      
      $ python get_sum.py 3.14159 3.335 -f 3 -a 
      3.14159 + 3.335 = 6.477
      
      $ python get_sum.py 
      usage: SUM [-h] [-a] [-f {1,2,3}] [-v] x y
      SUM: error: the following arguments are required: x, y

      hashlib

      hashlib是針對不同的安全哈希和消息摘要算法實現(xiàn)了一個通用的接口。

      生成md5

      import hashlib
      
      
      md5 = hashlib.md5()# 輸入的是字節(jié)串md5.update("test message".encode("utf-8"))
      
      res = md5.hexdigest()
      print(res)# c72b9698fa1927e1dd12d3cf26ed84b2

      為md5加鹽
      所謂加鹽就是update其他內(nèi)容,改變md5的值,防止撞庫。

      import hashlib
      
      
      md5 = hashlib.md5()# 輸入的是字節(jié)md5.update("加鹽".encode("utf-8"))
      md5.update("test message".encode("utf-8"))
      
      res = md5.hexdigest()
      print(res)# 3f5a030db81d9e5e83d2c8e7eba1965c

      uuid

      生成uuid4

      import uuid
      
      print(uuid.uuid4())# f1d50cdd-2f36-4db2-b788-ec4f2f08ce52

      subprocess

      subprocess 模塊允許你生成新的進程,連接它們的輸入、輸出、錯誤管道,并且獲取它們的返回碼。
      對于subprocess模塊,我們只需要關注底層的Popen接口的使用方法即可。
      常用參數(shù):

      • args
        一般來說是命令,推薦使用列表的方式傳入(有順序)

      • shell
        True或False
        在 POSIX,當 shell=True, shell 默認為 /bin/sh
        在 Windows,當 shell=True,環(huán)境變量 COMSPEC 指定了默認 shell,執(zhí)行命令時可以為True,但執(zhí)行批處理文件或可執(zhí)行文件時,不需要shell=True

      • stdinstdoutstderr
        分別指定了執(zhí)行的程序的標準輸入、輸出和標準錯誤文件句柄
        它們的合法值一般有:

        1. 其他Popen對象的stdin/stdout/stderr

        2. subprocess.PIPE 表示打開標準流的管道

        3. None

        4. 文件對象

      更加詳細內(nèi)容,請看官方文檔

      獲取返回信息

      1. 使用subprocess.PIPE接收

      2. popen_obj.stdout.read().decode("xx") 的方式

      當然也可以在stdout中傳入文件對象,直接寫入文件中

      使用例子

      import subprocess# 執(zhí)行沒有參數(shù)的subprocess.Popen(["dir"], shell=True, stdout=open("dir_res.txt", "w"))# 有參數(shù)# get_sum.py為argparse模塊最后的例子command = "python get_sum.py 3.47 2.48 -a -f 2"res2 = subprocess.Popen(command.split(" "), shell=True, stdout=subprocess.PIPE)
      print(res2.stdout.read().decode("gbk"))  # 3.47 + 2.48 = 5.95# stdout作為stdinres3 = subprocess.Popen(["echo", "www.baidu.com"],
                              shell=True, stdout=subprocess.PIPE)
      
      res4 = subprocess.Popen(["nslookup"], shell=True,
                              stdin=res3.stdout, stdout=subprocess.PIPE)
      
      print(res4.stdout.read().decode("gbk"))"""
      默認服務器:  UnKnown
      Address:  192.168.0.1
      
      > 服務器:  UnKnown
      Address:  192.168.0.1
      
      名稱:    www.baidu.com
      Address:  182.61.200.7
      
      >
      """

      我的github
      我的博客
      我的筆記


      1. num1 > num2時為[num2, num1] ?

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多