1. 程式人生 > >python——模塊

python——模塊

影響 步驟 env lpad 函數 project sin rec 系統命令

一、導入模塊

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*‘))
技術分享 View Code

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——模塊