python——模塊
一、導入模塊
Python之所以應用越來越廣泛,在一定程度上也依賴於其為程序員提供了大量的模塊以供使用,如果想要使用模塊,則需要導入。導入模塊有一下幾種方法:
1 import module 2 from module.xx.xx import xx 3 from module.xx.xx import xx as rename 4 from module.xx.xx import *
導入模塊其實就是告訴Python解釋器去解釋那個py文件
- 導入一個py文件,解釋器解釋該py文件
- 導入一個包,解釋器解釋該包下的 __init__.py 文件 【py2.7】
那麽問題來了,導入模塊時是根據那個路徑作為基準來進行的呢?即:sys.path
如果sys.path路徑列表沒有你想要的路徑,可以通過 sys.path.append(‘路徑‘) 添加。
import sys import os project_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(project_path)
二、安裝第三方模塊
方法一:軟件安裝(pip)
1. python2自帶pip,python3自帶pip3,可以在python安裝目錄下找到。
2. 添加環境變量。
3. 打開終端,輸入 pip3 install [模塊名]自動下載安裝。
方法二:源碼安裝
1. 下載模塊的源碼安裝包到本地,解壓。
2. 在解壓出來的文件中找到setup.py 文件,使用命令行進入此文件目錄
3. 執行 python setup.py install 完成源碼安裝
三、常用模塊
1. sys
用於提供對Python解釋器相關的操作:
常用操作 實例:進度百分比2. os
常用操作3. 序列化
Python中用於序列化的兩個模塊
- json 用於【字符串】和 【python基本數據類型】 間進行轉換
- pickle 用於【python特有的類型】 和 【python基本數據類型】間進行轉換
Json模塊提供了四個功能:dumps、dump、loads、load(常用帶s的方法)
pickle模塊提供了四個功能:dumps、dump、loads、load(常用帶s的方法)
# json json.loads() # 將字符串轉換成python基本數據類型 註意:字符串裏數據類型裏的字符串必須使用雙引號,因為在其他語言中,單引號不一定代表字符串 特殊:元組不能轉換,因為不屬於通用數據類型 import json n = ‘(11,22,33,"alex")‘ s = json.loads(n) print(s) json.dumps() # 將python的基本數據類型(包括元組)轉換成字符串
4. XML
XML是實現不同語言或程序之間進行數據交換的協議,XML文件格式如下:
<data> <country name="Liechtenstein"> <rank updated="yes">2</rank> <year>2023</year> <gdppc>141100</gdppc> <neighbor direction="E" name="Austria" /> <neighbor direction="W" name="Switzerland" /> </country> <country name="Singapore"> <rank updated="yes">5</rank> <year>2026</year> <gdppc>59900</gdppc> <neighbor direction="N" name="Malaysia" /> </country> <country name="Panama"> <rank updated="yes">69</rank> <year>2026</year> <gdppc>13600</gdppc> <neighbor direction="W" name="Costa Rica" /> <neighbor direction="E" name="Colombia" /> </country> </data>
A. 解析XML
方法一:利用ElementTree.XML將字符串解析成xml對象 from xml.etree import ElementTree as ET # 打開文件,讀取XML內容 str_xml = open(‘xo.xml‘, ‘r‘).read() # 將字符串解析成xml特殊對象,root代指xml文件的根節點 root = ET.XML(str_xml) 方法二:利用ElementTree.parse將文件直接解析成xml對象 from xml.etree import ElementTree as ET # 直接解析xml文件 tree = ET.parse("xo.xml") # 獲取xml文件的根節點 root = tree.getroot()
B. 操作XML
節點功能一覽由於 每個節點 都具有以上的方法,並且在上一步驟中解析時均得到了root(xml文件的根節點),so 可以利用以上方法進行操作xml文件。
a. 遍歷XML文檔的所有內容
# 頂層標簽 print(root.tag) # 遍歷XML文檔的第二層 for child in root: # 第二層節點的標簽名稱和標簽屬性 print(child.tag, child.attrib) # 遍歷XML文檔的第三層 for i in child: # 第三層節點的標簽名稱和內容 print(i.tag,i.text)
b、遍歷XML中指定的節點
# 頂層標簽 print(root.tag) # 遍歷XML中所有的year節點 for node in root.iter(‘year‘): # 節點的標簽名稱和內容 print(node.tag, node.text)
c、修改節點內容
由於修改的節點時,均是在內存中進行,其不會影響文件中的內容。所以,如果想要修改,則需要重新將內存中的內容寫到文件。
from xml.etree import ElementTree as ET ############ 解析方式一 ############ # 打開文件,讀取XML內容 str_xml = open(‘xo.xml‘, ‘r‘).read() # 將字符串解析成xml特殊對象,root代指xml文件的根節點 root = ET.XML(str_xml) ############ 操作 ############ # 頂層標簽 print(root.tag) # 循環所有的year節點 for node in root.iter(‘year‘): # 將year節點中的內容自增一 new_year = int(node.text) + 1 node.text = str(new_year) # 設置屬性 node.set(‘name‘, ‘alex‘) node.set(‘age‘, ‘18‘) # 刪除屬性 del node.attrib[‘name‘] ############ 保存文件 ############ tree = ET.ElementTree(root) tree.write("newnew.xml", encoding=‘utf-8‘) 解析字符串方式,修改,保存
from xml.etree import ElementTree as ET ############ 解析方式二 ############ # 直接解析xml文件 tree = ET.parse("xo.xml") # 獲取xml文件的根節點 root = tree.getroot() ############ 操作 ############ # 頂層標簽 print(root.tag) # 循環所有的year節點 for node in root.iter(‘year‘): # 將year節點中的內容自增一 new_year = int(node.text) + 1 node.text = str(new_year) # 設置屬性 node.set(‘name‘, ‘alex‘) node.set(‘age‘, ‘18‘) # 刪除屬性 del node.attrib[‘name‘] ############ 保存文件 ############ tree.write("newnew.xml", encoding=‘utf-8‘) 解析文件方式,修改,保存
d、刪除節點
解析字符串方式打開,刪除,保存 解析文件方式打開,刪除,保存C. 創建XML文檔
創建方式(一) 創建方式(二) 創建方式(三)由於原生保存的XML時默認無縮進,如果想要設置縮進的話, 需要修改保存方式:
from xml.etree import ElementTree as ET from xml.dom import minidom def prettify(elem): """將節點轉換成字符串,並添加縮進。 """ rough_string = ET.tostring(elem, ‘utf-8‘) reparsed = minidom.parseString(rough_string) return reparsed.toprettyxml(indent="\t") # 創建根節點 root = ET.Element("famliy") # 創建大兒子 # son1 = ET.Element(‘son‘, {‘name‘: ‘兒1‘}) son1 = root.makeelement(‘son‘, {‘name‘: ‘兒1‘}) # 創建小兒子 # son2 = ET.Element(‘son‘, {"name": ‘兒2‘}) son2 = root.makeelement(‘son‘, {"name": ‘兒2‘}) # 在大兒子中創建兩個孫子 # grandson1 = ET.Element(‘grandson‘, {‘name‘: ‘兒11‘}) grandson1 = son1.makeelement(‘grandson‘, {‘name‘: ‘兒11‘}) # grandson2 = ET.Element(‘grandson‘, {‘name‘: ‘兒12‘}) grandson2 = son1.makeelement(‘grandson‘, {‘name‘: ‘兒12‘}) son1.append(grandson1) son1.append(grandson2) # 把兒子添加到根節點中 root.append(son1) root.append(son1) raw_str = prettify(root) f = open("xxxoo.xml",‘w‘,encoding=‘utf-8‘) f.write(raw_str) f.close()
D. 命名空間
View Code詳細介紹,猛擊這裏
5. requests
使用模塊
GET請求 POST請求 其他請求更多requests模塊相關的文檔見:http://cn.python-requests.org/zh_CN/latest/
http://blog.csdn.net/shanzhizi/article/details/50903748
Http請求和XML實例
實例:檢測QQ賬號是否在線 實例:查看火車停靠信息6、random
import random print(random.random()) print(random.randint(1, 2)) print(random.randrange(1, 10))
import random checkcode = ‘‘ for i in range(4): current = random.randrange(0,4) if current != i: temp = chr(random.randint(65,90)) else: temp = random.randint(0,9) checkcode += str(temp) print checkcode 隨機驗證碼
7、configparser
configparser用於處理特定格式的文件,其本質上是利用open來操作文件。
指定格式1、獲取所有節點
1 2 3 4 5 6 |
import configparser
config = configparser.ConfigParser()
config.read( ‘xxxooo‘ , encoding = ‘utf-8‘ )
ret = config.sections()
print (ret)
|
2、獲取指定節點下所有的鍵值對
1 2 3 4 5 6 |
import configparser
config = configparser.ConfigParser()
config.read( ‘xxxooo‘ , encoding = ‘utf-8‘ )
ret = config.items( ‘section1‘ )
print (ret)
|
3、獲取指定節點下所有的建
1 2 3 4 5 6 |
import configparser
config = configparser.ConfigParser()
config.read( ‘xxxooo‘ , encoding = ‘utf-8‘ )
ret = config.options( ‘section1‘ )
print (ret)
|
4、獲取指定節點下指定key的值
1 2 3 4 5 6 7 8 9 10 11 12 |
import configparser
config = configparser.ConfigParser()
config.read( ‘xxxooo‘ , encoding = ‘utf-8‘ )
v = config.get( ‘section1‘ , ‘k1‘ )
# v = config.getint(‘section1‘, ‘k1‘)
# v = config.getfloat(‘section1‘, ‘k1‘)
# v = config.getboolean(‘section1‘, ‘k1‘)
print (v)
|
5、檢查、刪除、添加節點
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import configparser
config = configparser.ConfigParser()
config.read( ‘xxxooo‘ , encoding = ‘utf-8‘ )
# 檢查
has_sec = config.has_section( ‘section1‘ )
print (has_sec)
# 添加節點
config.add_section( "SEC_1" )
config.write( open ( ‘xxxooo‘ , ‘w‘ ))
# 刪除節點
config.remove_section( "SEC_1" )
config.write( open ( ‘xxxooo‘ , ‘w‘ ))
|
6、檢查、刪除、設置指定組內的鍵值對
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import configparser
config = configparser.ConfigParser()
config.read( ‘xxxooo‘ , encoding = ‘utf-8‘ )
# 檢查
has_opt = config.has_option( ‘section1‘ , ‘k1‘ )
print (has_opt)
# 刪除
config.remove_option( ‘section1‘ , ‘k1‘ )
config.write( open ( ‘xxxooo‘ , ‘w‘ ))
# 設置
config. set ( ‘section1‘ , ‘k10‘ , "123" )
config.write( open ( ‘xxxooo‘ , ‘w‘ ))
|
8、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‘)
日誌等級:
CRITICAL = 50 FATAL = CRITICAL ERROR = 40 WARNING = 30 WARN = WARNING INFO = 20 DEBUG = 10 NOTSET = 0
註:只有【當前寫等級】大於【日誌等級】時,日誌文件才被記錄。
日誌記錄格式:
2、多文件日誌
對於上述記錄日誌的功能,只能將日誌記錄在單文件中,如果想要設置多個日誌文件,logging.basicConfig將無法完成,需要自定義文件和日誌操作對象。
日誌一 日誌(二)如上述創建的兩個日誌對象
- 當使用【logger1】寫日誌時,會將相應的內容寫入 l1_1.log 和 l1_2.log 文件中
- 當使用【logger2】寫日誌時,會將相應的內容寫入 l2_1.log 文件中
9、系統命令(subprocess)
call
執行命令,返回狀態碼
1 2 |
ret = subprocess.call([ "ls" , "-l" ], shell = False )
ret = subprocess.call( "ls -l" , shell = True )
|
check_call
執行命令,如果執行狀態碼是 0 ,則返回0,否則拋異常
1 2 |
subprocess.check_call([ "ls" , "-l" ])
subprocess.check_call( "exit 1" , shell = True )
|
check_output
執行命令,如果狀態碼是 0 ,則返回執行結果,否則拋異常
1 2 |
subprocess.check_output([ "echo" , "Hello World!" ])
subprocess.check_output( "exit 1" , shell = True )
|
subprocess.Popen(...)
用於執行復雜的系統命令
參數:
- args:shell命令,可以是字符串或者序列類型(如:list,元組)
- bufsize:指定緩沖。0 無緩沖,1 行緩沖,其他 緩沖區大小,負值 系統緩沖
- stdin, stdout, stderr:分別表示程序的標準輸入、輸出、錯誤句柄
- preexec_fn:只在Unix平臺下有效,用於指定一個可執行對象(callable object),它將在子進程運行之前被調用
- close_sfs:在windows平臺下,如果close_fds被設置為True,則新創建的子進程將不會繼承父進程的輸入、輸出、錯誤管道。
所以不能將close_fds設置為True同時重定向子進程的標準輸入、輸出與錯誤(stdin, stdout, stderr)。 - shell:同上
- cwd:用於設置子進程的當前目錄
- env:用於指定子進程的環境變量。如果env = None,子進程的環境變量將從父進程中繼承。
- universal_newlines:不同系統的換行符不同,True -> 同意使用 \n
- startupinfo與createionflags只在windows下有效
將被傳遞給底層的CreateProcess()函數,用於設置子進程的一些屬性,如:主窗口的外觀,進程的優先級等等
終端輸入的命令分為兩種:
- 輸入即可得到輸出,如:ifconfig
- 輸入進行某環境,依賴再輸入,如:python
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)
View Code View Code
10、shutil(文件處理、解壓縮)
高級的 文件、文件夾、壓縮包 處理模塊
shutil.copyfileobj(fsrc, fdst[, length])
將文件內容拷貝到另一個文件中
1 2 3 |
import shutil
shutil.copyfileobj( open ( ‘old.xml‘ , ‘r‘ ), open ( ‘new.xml‘ , ‘w‘ ))
|
shutil.copyfile(src, dst)
拷貝文件
1 | shutil.copyfile( ‘f1.log‘ , ‘f2.log‘ ) |
shutil.copymode(src, dst)
僅拷貝權限。內容、組、用戶均不變
1 | shutil.copymode( ‘f1.log‘ , ‘f2.log‘ ) |
shutil.copystat(src, dst)
僅拷貝狀態的信息,包括:mode bits, atime, mtime, flags
1 | shutil.copystat( ‘f1.log‘ , ‘f2.log‘ ) |
shutil.copy(src, dst)
拷貝文件和權限
1 2 3 |
import shutil
shutil.copy( ‘f1.log‘ , ‘f2.log‘ )
|
shutil.copy2(src, dst)
拷貝文件和狀態信息
1 2 3 |
import shutil
shutil.copy2( ‘f1.log‘ , ‘f2.log‘ )
|
shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)
遞歸的去拷貝文件夾
1 2 3 |
import shutil
shutil.copytree( ‘folder1‘ , ‘folder2‘ , ignore = shutil.ignore_patterns( ‘*.pyc‘ , ‘tmp*‘ ))
|
shutil.rmtree(path[, ignore_errors[, onerror]])
遞歸的去刪除文件
1 2 3 |
import shutil
shutil.rmtree( ‘folder1‘ )
|
shutil.move(src, dst)
遞歸的去移動文件,它類似mv命令,其實就是重命名。
1 2 3 |
import shutil
shutil.move( ‘folder1‘ , ‘folder3‘ )
|
shutil.make_archive(base_name, format,...)
創建壓縮包並返回文件路徑,例如:zip、tar
創建壓縮包並返回文件路徑,例如:zip、tar
- base_name: 壓縮包的文件名,也可以是壓縮包的路徑。只是文件名時,則保存至當前目錄,否則保存至指定路徑,
如:www =>保存至當前路徑
如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/ - format: 壓縮包種類,“zip”, “tar”, “bztar”,“gztar”
- root_dir: 要壓縮的文件夾路徑(默認當前目錄)
- owner: 用戶,默認當前用戶
- group: 組,默認當前組
- logger: 用於記錄日誌,通常是logging.Logger對象
#將 /Users/wupeiqi/Downloads/test 下的文件打包放置當前程序目錄 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 對壓縮包的處理是調用 ZipFile 和 TarFile 兩個模塊來進行的,詳細:
zipfile解壓縮 tarfile解壓縮11、time
時間相關的操作,時間有三種表示方式:
- 時間戳 1970年1月1日之後的秒,即:time.time()
- 格式化的字符串 2014-11-11 11:11, 即:time.strftime(‘%Y-%m-%d‘)
- 結構化時間 元組包含了:年、日、星期等... time.struct_time 即:time.localtime()
print time.time() print time.mktime(time.localtime()) print time.gmtime() #可加時間戳參數 print time.localtime() #可加時間戳參數 print time.strptime(‘2014-11-11‘, ‘%Y-%m-%d‘) print time.strftime(‘%Y-%m-%d‘) #默認當前時間 print time.strftime(‘%Y-%m-%d‘,time.localtime()) #默認當前時間 print time.asctime() print time.asctime(time.localtime()) print time.ctime(time.time()) import datetime ‘‘‘ datetime.date:表示日期的類。常用的屬性有year, month, day datetime.time:表示時間的類。常用的屬性有hour, minute, second, microsecond datetime.datetime:表示日期時間 datetime.timedelta:表示時間間隔,即兩個時間點之間的長度 timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]]) strftime("%Y-%m-%d") ‘‘‘ import datetime print datetime.datetime.now() print datetime.datetime.now() - datetime.timedelta(days=5)
python——模塊