python06-模塊(三)

回顧

  • os.path.dirname(fileName):獲取文件的上級(jí)路徑
  • 全部變量__file__:獲取文件的全路徑
  • os.path.join(path,fileName):拼接路徑
  • __builtins__:所有的內(nèi)置函數(shù)都在里面(以后會(huì)用)
  • urllib & requests 作用:發(fā)送http請(qǐng)求,并獲取返回值

XML

  • xml解析(2中解析方式)
from xml.etree import ElementTree as ET
# 第一種方式:得到一個(gè)Element對(duì)象
root = ET.XML(xmlStr)
# 第二種方式:得到一個(gè)ElementTree對(duì)象
tree = ET.parse('fileName')
root = tree.getroot()
  • Element類

    • xml每一個(gè)節(jié)點(diǎn)都是Element類的對(duì)象
    • Element api
      • tag:獲得當(dāng)前節(jié)點(diǎn)的標(biāo)簽名
      • attrib:當(dāng)前標(biāo)簽的屬性,返回字典對(duì)象
      • text:當(dāng)前標(biāo)簽的內(nèi)容
      • makeelement('eleName',{'att1':'val1',...})
      • append(element):在節(jié)點(diǎn)里追加子節(jié)點(diǎn)
      • remove(ele):刪除節(jié)點(diǎn),傳入element對(duì)象
      • find(eleName):根據(jù)節(jié)點(diǎn)名查找子節(jié)點(diǎn)
      • findtext():
  • ElementTree類

    • ElementTree創(chuàng)建方式:
      1. ET.parse('fileName')

        • 通過(guò)查看源代碼,發(fā)現(xiàn):
        self.__class__(): # __class__代表當(dāng)前類名
        
      2. ET.ElementTree(rootEle)

    • ElementTree api:
      • getroot():獲取根節(jié)點(diǎn)
      • write(fileName):將xml回寫(xiě)到文件
    • 在回寫(xiě)的過(guò)程中,如果標(biāo)簽內(nèi)沒(méi)有內(nèi)容,默認(rèn)回寫(xiě)得到的是自閉合的標(biāo)簽,如果不想得到自閉合的效果:(但是一般不這么用,浪費(fèi)空間)
     # 不自閉合
    tree.write('fileName', short_empty_elemet = False)
    
    • xml中如果有中文,回寫(xiě)時(shí)需要指定編碼:
    tree.write('fileName', encoding = 'utf-8')
    
    • xml簡(jiǎn)介:在xml文件頂部添加xml的簡(jiǎn)介
    tree.write('fileName', xml_declaration=True)
    
  • 創(chuàng)建Element的三種方式

    1. ET.Element('tagName', {'attrib1':'val1',...})
      • 創(chuàng)建的僅僅為Element對(duì)象,需要添加到節(jié)點(diǎn)中
    2. ele.makeelement('tagName', {'attrib1':'val1',...})
      • 同上
    3. ET.subelement(ele,'tagName', {'attrib1':'val1',...})
      • 在某個(gè)節(jié)點(diǎn)里創(chuàng)建子節(jié)點(diǎn)
  • xml縮進(jìn):

    • 通過(guò)ElementTree寫(xiě)到文件的xml不帶縮進(jìn)效果,如果想要有縮進(jìn)的效果,需要用到另一個(gè)模塊:
    from xml.dom import minidom
    
    • minidom模塊也有對(duì)xml進(jìn)行操作的功能,但是功能少,效率低,所以只用它的格式化功能
    from xml.etree import ElementTree as ET
    from xml.dom import minidom
    
    root = ET.Element('root', {'attrib1': 'val1'})
    son1 = root.makeelement('son1', {'attrib1': 'val1'})
    son1.text = "son1_text"
    root.append(son1)
    ET.SubElement(root, 'son2', {'attrib1': 'val1', 'attrib2': 'val2'})
    
    xml_str = ET.tostring(root, encoding='utf-8', short_empty_elements=True)
    parser = minidom.parseString(xml_str)
    pretty_xml = parser.toprettyxml()
    with open('pretty.xml', mode='w') as file:
        file.write(pretty_xml)
    
  • 命名空間

    from xml.etree import ElementTree as ET
    
    ET.register_namespace('com',"http://www.company.com") #some name
    
    # build a tree structure
    root = ET.Element("{http://www.company.com}STUFF")
    body = ET.SubElement(root, "{http://www.company.com}MORE_STUFF", attrib={"{http://www.company.com}hhh": "123"})
    body.text = "STUFF EVERYWHERE!"
    
    # wrap it in an ElementTree instance, and save as XML
    tree = ET.ElementTree(root)
    
    tree.write("page.xml",
               xml_declaration=True,
               encoding='utf-8',
               method="xml")
    

configparser

  • configparser用于處理特定格式的文件,其本質(zhì)是通過(guò)open來(lái)操作文件
# 注釋
; 注釋
[section1]
key1:value1
key2=value2

[setction2]
key1=value1
key2:value2
import configparser

parser = configparser.ConfigParser()
parser.read('conf', encoding='utf-8')
sections = parser.sections()
# 獲取所有的section
print(sections) # ['section1', 'section2']
# 獲取section下的鍵值對(duì)
items = parser.items('section1')
print(items) # [('key1', 'value1'), ('key2', 'value2')]
# 獲取指定節(jié)點(diǎn)下所有的建
options = parser.options('section1')
print(options) #['key1', 'key2']
# 獲取指定節(jié)點(diǎn)下指定key的值
value = parser.get('section1', 'key1')
print(value) # value1
# getint()/getfloat()/getboolean()
# 檢查、刪除、添加節(jié)點(diǎn)
hasSection = parser.has_section('section1')
print(hasSection) # True
parser.add_section('section3')
parser.remove_section('section1')
with open('conf', mode='w') as file:
    parser.write(file)
# 檢查、刪除、設(shè)置指定組內(nèi)的鍵值對(duì)
has_option = parser.has_option(section='section2',option='key1')
print(has_option) # True
parser.remove_option('section2', 'key2')
option3 = parser.set('section2','key3','val3')
with open('conf',mode='w') as file:
    parser.write(file)

xml

  • 刪除屬性:
    • del node.attrib['attbitName']

requests

  • 無(wú)參實(shí)例:
import requests
 
ret = requests.get('https://github.com/timeline.json')
 
print(ret.url)
print(ret.text)
  • 有參實(shí)例:
import requests
 
payload = {'key1': 'value1', 'key2': 'value2'}
ret = requests.get("http://httpbin.org/get", params=payload)
 
print(ret.url)
print(ret.text)
  • 基本post實(shí)例
import requests
 
payload = {'key1': 'value1', 'key2': 'value2'}
ret = requests.post("http://httpbin.org/post", data=payload)
 
print(ret.text)
  • 發(fā)送請(qǐng)求頭和數(shù)據(jù)實(shí)例
import requests
import json
 
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
headers = {'content-type': 'application/json'}
 
ret = requests.post(url, data=json.dumps(payload), headers=headers)
 
print(ret.text)
print(ret.cookies)
  • 其他請(qǐng)求
requests.get(url, params=None, **kwargs)
requests.post(url, data=None, json=None, **kwargs)
requests.put(url, data=None, **kwargs)
requests.head(url, **kwargs)
requests.delete(url, **kwargs)
requests.patch(url, data=None, **kwargs)
requests.options(url, **kwargs)
 
# 以上方法均是在此方法的基礎(chǔ)上構(gòu)建
requests.request(method, url, **kwargs)
  • Http請(qǐng)求和XML實(shí)例
import urllib
import requests
from xml.etree import ElementTree as ET

# 使用內(nèi)置模塊urllib發(fā)送HTTP請(qǐng)求,或者XML格式內(nèi)容
"""
f = urllib.request.urlopen('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')
result = f.read().decode('utf-8')
"""


# 使用第三方模塊requests發(fā)送HTTP請(qǐng)求,或者XML格式內(nèi)容
r = requests.get('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')
result = r.text

# 解析XML格式內(nèi)容
node = ET.XML(result)

# 獲取內(nèi)容
if node.text == "Y":
    print("在線")
else:
    print("離線")
  • 查看火車停靠信息
import urllib
import requests
from xml.etree import ElementTree as ET

# 使用內(nèi)置模塊urllib發(fā)送HTTP請(qǐng)求,或者XML格式內(nèi)容
"""
f = urllib.request.urlopen('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=')
result = f.read().decode('utf-8')
"""

# 使用第三方模塊requests發(fā)送HTTP請(qǐng)求,或者XML格式內(nèi)容
r = requests.get('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=')
result = r.text

# 解析XML格式內(nèi)容
root = ET.XML(result)
for node in root.iter('TrainDetailInfo'):
    print(node.find('TrainStation').text,node.find('StartTime').text,node.tag,node.attrib)

logging模塊

  • 程序運(yùn)行時(shí)經(jīng)常遇到報(bào)錯(cuò),日志記錄等,如果讓每個(gè)用戶的操作都單獨(dú)打開(kāi)日志文件記錄,會(huì)出現(xiàn)線程安全問(wèn)題
  • logging用于便捷記錄日志且線程安全的模塊
import logging
  
  
logging.basicConfig(filename='log.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')
logging.log(10,'log')
  • 日志等級(jí)
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
  • 多文件日志
    • logging拆分:
      • 比較函數(shù):信息等級(jí):FileHandler
      • 寫(xiě)入函數(shù):對(duì)滿條件的信息寫(xiě)入文件:Logger
    • Logger + fileHandler
# 定義文件
file_1_1 = logging.FileHandler('l1_1.log', 'a', encoding='utf-8')
fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s")
file_1_1.setFormatter(fmt)

file_1_2 = logging.FileHandler('l1_2.log', 'a', encoding='utf-8')
fmt = logging.Formatter()
file_1_2.setFormatter(fmt)

# 定義日志
logger1 = logging.Logger('s1', level=logging.ERROR)
logger1.addHandler(file_1_1)
logger1.addHandler(file_1_2)


# 寫(xiě)日志
logger1.critical('1111')
# 定義文件
file_2_1 = logging.FileHandler('l2_1.log', 'a')
fmt = logging.Formatter()
file_2_1.setFormatter(fmt)

# 定義日志
logger2 = logging.Logger('s2', level=logging.INFO)
logger2.addHandler(file_2_1)
  • 如上述創(chuàng)建的兩個(gè)日志對(duì)象
    • 當(dāng)使用【logger1】寫(xiě)日志時(shí),會(huì)將相應(yīng)的內(nèi)容寫(xiě)入 l1_1.log 和 l1_2.log 文件中
    • 當(dāng)使用【logger2】寫(xiě)日志時(shí),會(huì)將相應(yīng)的內(nèi)容寫(xiě)入 l2_1.log 文件中

系統(tǒng)命令-subprocess模塊

  • call():執(zhí)行命令,返回狀態(tài)
ret = subprocess.call(["ls", "-l"], shell=False)
ret = subprocess.call("ls -l", shell=True)
  • check_call():執(zhí)行命令,如果執(zhí)行狀態(tài)碼是 0 ,則返回0,否則拋異常
subprocess.check_call(["ls", "-l"])
subprocess.check_call("exit 1", shell=True)
  • check_output():執(zhí)行命令,如果狀態(tài)碼是 0 ,則返回執(zhí)行結(jié)果,否則拋異常
subprocess.check_output(["echo", "Hello World!"])
subprocess.check_output("exit 1", shell=True)
  • 用于執(zhí)行復(fù)雜的系統(tǒng)命令:subprocess.Popen(...)
import subprocess
ret1 = subprocess.Popen(["mkdir","t1"])
ret2 = subprocess.Popen("mkdir t2", shell=True)
import subprocess

obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/dev',)
import subprocess

obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
obj.stdin.write("print(1)\n")
obj.stdin.write("print(2)")
obj.stdin.close()

cmd_out = obj.stdout.read()
obj.stdout.close()
cmd_error = obj.stderr.read()
obj.stderr.close()

print(cmd_out)
print(cmd_error)
import subprocess

obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
obj.stdin.write("print(1)\n")
obj.stdin.write("print(2)")

out_error_list = obj.communicate()
print(out_error_list)
import subprocess

obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
out_error_list = obj.communicate('print("hello")')
print(out_error_list)

datatime

datetime.date:表示日期的類。常用的屬性有year, month, day
datetime.time:表示時(shí)間的類。常用的屬性有hour, minute, second, microsecond
datetime.datetime:表示日期時(shí)間
datetime.timedelta:表示時(shí)間間隔,即兩個(gè)時(shí)間點(diǎn)之間的長(zhǎng)度
timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
strftime("%Y-%m-%d")

shutil

  • 高級(jí)的 文件、文件夾、壓縮包 處理模塊
  • 將文件內(nèi)容拷貝到另一個(gè)文件中
import shutil
 
shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))
  • shutil.copyfile(src, dst)
shutil.copyfile('f1.log', 'f2.log')
  • 僅拷貝權(quán)限。內(nèi)容、組、用戶均不變
shutil.copymode('f1.log', 'f2.log')
  • 僅拷貝狀態(tài)的信息,包括:mode bits, atime, mtime, flags
shutil.copystat('f1.log', 'f2.log')
  • shutil.copy(src, dst)
import shutil
 
shutil.copy('f1.log', 'f2.log')
  • shutil.copy2(src, dst)
import shutil
 
shutil.copy2('f1.log', 'f2.log')
  • 遞歸的去拷貝文件夾
mport shutil
 
shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
import shutil

shutil.copytree('f1', 'f2', symlinks=True, ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
  • 遞歸的去刪除文件
import shutil
 
shutil.rmtree('folder1')
  • 遞歸的去移動(dòng)文件,它類似mv命令,其實(shí)就是重命名
import shutil
 
shutil.move('folder1', 'folder3')
  • 創(chuàng)建壓縮包并返回文件路徑,例如:zip、tar
#將 /Users/wupeiqi/Downloads/test 下的文件打包放置當(dāng)前程序目錄
import shutil
ret = shutil.make_archive("wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test')
  
  
#將 /Users/wupeiqi/Downloads/test 下的文件打包放置 /Users/wupeiqi/目錄
import shutil
ret = shutil.make_archive("/Users/wupeiqi/wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test')
  • shutil 對(duì)壓縮包的處理是調(diào)用 ZipFile 和 TarFile 兩個(gè)模塊來(lái)進(jìn)行的,詳細(xì):
import zipfile

# 壓縮
z = zipfile.ZipFile('laxi.zip', 'w')
z.write('a.log')
z.write('data.data')
z.close()

# 解壓
z = zipfile.ZipFile('laxi.zip', 'r')
z.extractall()
z.close()

import tarfile

# 壓縮
tar = tarfile.open('your.tar','w')
tar.add('/Users/wupeiqi/PycharmProjects/bbs2.log', arcname='bbs2.log')
tar.add('/Users/wupeiqi/PycharmProjects/cmdb.log', arcname='cmdb.log')
tar.close()

# 解壓
tar = tarfile.open('your.tar','r')
tar.extractall()  # 可設(shè)置解壓地址
tar.close()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容