1. 程式人生 > >python筆記--內置模塊

python筆記--內置模塊

python、庫、內置模塊

python常用內置模塊

類似於函數式編程,函數式編程則完成一個功能,其他代碼用來調用即可,提供了代碼的重用性和代碼間的耦合。而對於一個復雜的功能來說,可能需要多個函數才能完成(函數又可以在不同的.py文件中),n.py文件組成的代碼集合就稱為模塊。

模塊分為三種:自定義模塊、內置模塊、開源模塊http://pypi.python.org

一、導入模塊

方法:

import module
from module.xx.xx import xx
from module.xx.xx import xx as rename  
from module.xx.xx import *

導入模塊其實就是告訴Python解釋器去解釋那個py

文件,導入一個py文件,解釋器解釋該py文件,導入一個包,解釋器解釋該包下的 __init__.py 文件。

那麽問題來了,導入模塊時是根據那個路徑作為基準來進行的呢?即:sys.path

如果sys.path路徑列表沒有你想要的路徑,可以通過 sys.path.append(‘路徑‘) 添加。可以通過os模塊獲得路徑,例如:

import sys
import os
pre_path = os.path.abspath(‘../‘)
sys.path.append(pre_path)

二、第三方模塊的下載安裝

兩種方法:

使用pip工具,具體使用方法,可以參照:

http://blog.csdn.net/olanlanxiari/article/details/48086917

下載源碼包,解壓後進入解壓目錄,依次執行:

python setup.py build
python setup.py install

三、內置模塊

os,用於提供系統級別的操作

os.getcwd() 獲取當前工作目錄,即當前python腳本工作的目錄路徑

os.chdir("dirname") 改變當前腳本工作目錄;相當於shellcd

os.curdir 返回當前目錄: (‘.‘)

os.pardir 獲取當前目錄的父目錄字符串名:(‘..‘)

os.makedirs(‘dirname1/dirname2‘) 可生成多層遞歸目錄

os.removedirs(‘dirname1‘) 若目錄為空,則刪除,並遞歸到上一級目錄,如若也為空,則刪除,依此類推

os.mkdir(‘dirname‘) 生成單級目錄;相當於shellmkdir dirname

os.rmdir(‘dirname‘) 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shellrmdir dirname

os.listdir(‘dirname‘) 列出指定目錄下的所有文件和子目錄,包括隱藏文件,並以列表方式打印

os.remove() 刪除一個文件

os.rename("oldname","newname") 重命名文件/目錄

os.stat(‘path/filename‘) 獲取文件/目錄信息

os.sep 輸出操作系統特定的路徑分隔符,win下為"\\",Linux下為"/"

os.linesep 輸出當前平臺使用的行終止符(換行符),win下為"\t\n",Linux下為"\n"

os.pathsep 輸出用於分割文件路徑的字符串

os.name 輸出字符串指示當前使用平臺。win->‘nt‘; Linux->‘posix‘

os.system("bash command") 運行shell命令,直接顯示

os.environ 獲取系統環境變量

os.path.abspath(path) 返回path規範化的絕對路徑

os.path.split(path) 將path分割成目錄和文件名二元組返回

os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素

os.path.basename(path) 返回path最後的文件名。如果path以/或\結尾,那麽就會返回空值。即os.path.split(path)的第二個元素

os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False

os.path.isabs(path) 如果path是絕對路徑,返回True,否則返回False

os.path.isfile(path) 如果path是一個存在的文件,返回True,否則返回False

os.path.isdir(path) 如果path是一個存在的目錄,則返回True,否則返回False

os.path.islink(path) 如果path是一個鏈接目錄,返回True,否則返回False

os.path.ismount(path) 如果path掛載了設備,返回True,否則返回False

os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,常用於拼接路徑

os.path.getatime(path) 返回path所指向的文件或者目錄的最後訪問時間

os.path.getctime(path) 返回path所指向的文件或者目錄的最後變化時間

os.path.getmtime(path) 返回path所指向的文件或者目錄的最後修改時間

os.walk(path) 目錄生成器返回格式:(dirpath,[dirnames],[filenames]),例如:

>>> import os
>>> for ROOT,DIR,FILE in os.walk(‘/root/test‘):
...     print ROOT
...     print DIR
...     print FILE
... 
/root/test
[‘lala‘]
[‘test.txt‘, ‘001.txt‘, ‘002.py‘]
/root/test/lala
[]
[‘003.txt‘]

#我們可以看一下/root/test的目錄結構:
[[email protected] ~]# tree /root/test
/root/test
├── 001.txt
├── 002.py
├── lala
│   └── 003.txt
└── test.txt -> test.txt

1 directory, 4 files


sys,用於提供對解釋器相關的操作

sys.argv 命令行參數,結果是個列表,第一個元素是程序名,之後的元素是執行程序攜帶的參數。例如:

[[email protected] /]# cat /root/test.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys
print sys.argv
print sys.argv[0]
print sys.argv[1]
print sys.argv[2]
[[email protected] /]# python /root/test.py a b c
[‘/root/test.py‘, ‘a‘, ‘b‘, ‘c‘]
/root/test.py   #argv[0]
a               #argv[1]
b               #argv[2]

sys.exit() 執行到sys.exit()時,退出程序,括號中可以加上數字,sys.exit(0)表示正常退出。

sys.version 返回Python解釋程序的版本信息

sys.maxint 返回最大的Int

sys.path 返回模塊的搜索路徑,以列表的形式,可以追加自定義路徑。

sys.platform 返回操作系統平臺名稱

sys.stdin.readline() 標準輸入,例如:

>>> name=sys.stdin.readline()
FJC    #手動輸入
>>> print name
FJC

sys.stdout.write(內容) 標準輸出

sys.stdout.flush() 配合time.sleep(1)實現實時輸出信息,例如:

>>> import sys
>>> import time
>>> for i in range(3):
...    print i,
...    sys.stdout.flush()
...    time.sleep(1)


0 1 2       #每隔一秒輸出一個數字

shutil,高級的 文件、文件夾、壓縮包 處理模塊

shutil.copyfileobj(fsrc, fdst[, length])

將文件內容拷貝到另一個文件中,可以部分內容

#註意! 在其中fsrcfdst都是文件對象,都需要打開後才能進行復制操作,例如:

[[email protected] ~]# cat test1
test1
[[email protected] ~]# cat test2
[[email protected] ~]# python
>>> n=open(‘test1‘,‘r+‘)
>>> m=open(‘test2‘,‘a+‘)
>>> import shutil
>>> shutil.copyfileobj(n,m)
>>> n.close
<built-in method close of file object at 0x7fd57bd165d0>
>>> m.close
<built-in method close of file object at 0x7fd57bd16660>
>>> quit()
[[email protected] ~]# cat test2
test1

shutil.copyfile(src, dst)

僅拷貝文件到文件或目錄

shutil.copymode(src, dst)

僅拷貝權限,內容、組、用戶均不變

shutil.copystat(src, dst)

拷貝狀態的信息,包括:mode bits, atime, mtime, flags

shutil.copy(src, dst)

拷貝文件和權限

shutil.copy2(src, dst)

拷貝文件和狀態信息

shutil.ignore_patterns(*patterns)#忽略的參數

shutil.copytree(src, dst, symlinks=True, ignore=None) #symlinks=True表示原目錄中的符號鏈接文件會被直接復制到目標目錄中;symlinks=False表示會將原目錄中符號鏈接文件的正本文件復制到目標目錄中。

遞歸的去拷貝文件,例如:

[[email protected] ~]# tree test
test
├── 001.txt
├── 002.py
└── lala
    └── 003.txt
 
1 directory, 3 files
 
#遞歸拷貝,註意目標目錄不能實現建立,否則會報錯
>>> from shutil import *
>>> copytree(‘test‘,‘test1‘,ignore=ignore_patterns(‘*.py‘))
 
[[email protected] ~]# tree test1
test1
├── 001.txt
└── lala
    └── 003.txt
 
1 directory, 2 files

shutil.rmtree(path[, ignore_errors[, onerror]])

遞歸的去刪除文件

shutil.move(src, dst)

遞歸的去移動文件

python3.0+版本

shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]])

創建壓縮包並返回文件路徑及名稱。

base_name: 壓縮包的文件名,也可以是壓縮包的路徑。只是文件名時,則保存至當前目錄,否則保存至指定路徑。

format: 壓縮包種類,“zip, tar, bztar”,“gztar

root_dir: 要壓縮的文件夾路徑(默認當前目錄)

owner: 用戶,默認當前用戶

group: 組,默認當前組

logger: 用於記錄日誌,通常是logging.Logger對象

例如:

>>> os.chdir(‘c:\\‘)
>>> ret=shutil.make_archive(‘www‘,‘zip‘,root_dir=‘c:\\test‘)
>>> ret
‘c:\\www.zip‘
#表示將c:\\test目錄下的文件壓縮,保存到當前目錄,命名為www
 
>>> ret=shutil.make_archive(‘c:\\www\\myfile‘,‘zip‘,root_dir=‘c:\\test‘)
>>> ret
‘c:\\www\\myfile.zip‘
#表示將c:\\test目錄下的文件壓縮,保存到c:\\www目錄下,命名為myfile

shutil 對壓縮包的處理是調用 ZipFile TarFile 兩個模塊來進行的。

>>> import zipfile
#壓縮
>>> z=zipfile.ZipFile(‘test.zip‘,‘w‘)
>>> z.write(‘a.log‘)
>>> z.write(‘b.data‘)
>>> z.close()
# 解壓
>>> z = zipfile.ZipFile(‘test.zip‘, ‘r‘)
>>> z.extractall()
>>> z.close()

>>> import tarfile
#壓縮
>>> tar=tarfile.open(‘my.tar‘,‘w‘)
>>> tar.add(‘a.log‘,arcname=‘aa.log‘)   #arcname可以改變文件壓縮後的名稱
>>> tar.add(‘b.data‘,arcname=‘bb.data‘)
>>> tar.close()
#解壓
# 解壓
>>> tar = tarfile.open(‘your.tar‘,‘r‘)
>>> tar.extractall()   #可設置解壓地址
>>> tar.close()

random,用於生成隨機數

random.random()

返回隨機數,在0和1範圍內

random.randint(1,3)

返回隨機整數,在1和3範圍內,包括13

random.randrange(1,10)

返回隨機整數,在1和10範圍內,不包括10

random.randrange(1,10,2)

末尾的2表示跳數,每隔兩個取一個數,起始位置為1,所以這個結果就是1~10之間的隨機奇數。

random.sample(array,n)

表示從一個數組中隨機取出n個元素,例如:

>>> import random
>>> random.sample([1,2,3,4],1)
[3]

hashlib,提供常見的摘要算法,如:MD5SHA1

>>> import hashlib
>>> test=hashlib.md5()
>>> test.update(‘how to use md5 in python hashlib?‘)
>>> print test.hexdigest()
d26a53750bc40b38b65a520292f69306

如果,數據量很大,可以分塊多次調用update(),最後的計算結果是一樣的。

>>> test2=hashlib.md5()
>>> test2.update(‘how to use md5 ‘)
>>> test2.update(‘in python hashlib?‘)
>>> print test2.hexdigest()
d26a53750bc40b38b65a520292f69306

shelve,簡單的數據存儲方案

只有一個函數open(),這個函數接收一個參數就是文件名,然後返回一個shelf對象,你可以用他來存儲東西,就可以簡單的把他當作一個字典,key必須為字符串,而值可以是python所支持的數據。當你存儲完畢的時候,就調用close函數來關閉。

>>> import shelve
>>> s=shelve.open(‘test.txt‘)
>>> s[‘x‘]=[1,2,3]
>>> s[‘y‘]=[4,5,6]
>>> s[‘x‘]
[1, 2, 3]
#不過有個小問題,例如:
>>> s[‘x‘].append(4)
>>> s[‘x‘]
[1, 2, 3]

新添加的元素到哪裏去了呢?其實,元素4沒有寫回,你把[1,2,3]存到了x,當你再次讀取s[‘x‘]的時候,s[‘x‘]只是一個拷貝,而你沒有將拷貝寫回,所以當你再次讀取s[‘x‘]的時候,它又從源中讀取了一個拷貝,所以,你新修改的內容並不會出現在拷貝中,解決的辦法就是,利用一個緩存的變量,例如:

>>> temp=s[‘x‘]
>>> temp.append(4)
>>> s[‘x‘]=temp
>>> s[‘x‘]
[1, 2, 3, 4]

time,時間訪問和轉換

time.time() 返回當前時間的時間戳(1970紀元後經過的浮點秒數)。

time.localtime([時間戳]) 轉換時間戳為一個時間元組,沒有參數是指當前時間。例如:

>>> a=time.localtime()
>>> type(a)
<type ‘time.struct_time‘>
>>> a
time.struct_time(tm_year=2017, tm_mon=5, tm_mday=23, tm_hour=18, tm_min=11, tm_sec=30, tm_wday=1, tm_yday=143, tm_isdst=0)

time.asctime([tuple]) 轉換時間元組為一個可讀性好的格式,沒有參數是指當前時間。例如:

>>> time.asctime(time.localtime())
‘Tue May 23 18:26:25 2017‘

time.ctime(時間戳) 轉換時間戳為一個可讀性好的格式,沒有參數是指當前時間。例如:

>>> time.ctime(time.time())
‘Tue May 23 18:28:46 2017‘

time.sleep(seconds) 按照給定的秒數延遲執行,參數可以是整數或浮點數。

time.strftime(format[,tuple]) 將元組時間轉換成指定格式,沒有tuple是定當前時間。例如:

>>> time.strftime(‘%Y-%m-%d %H:%M:%S‘)
‘2017-05-23 18:39:44‘
>>> time.strftime(‘%Y-%m-%d %H:%M:%S‘,time.localtime(12345))
‘1970-01-01 11:25:45‘

re,正則表達式

re.match(pattern, string) 僅從字符串頭開始匹配,例如:

>>> re.match(‘abc‘,‘1abc2abc‘)#沒有結果
>>> a=re.match(‘abc‘,‘abc1abc2abc‘)
>>> a.group()
‘abc‘

re.search(pattern, string) 匹配整個字符串,直到找到一個匹配,例如:

>>> b=re.search(‘abc‘,‘1abc2abc‘)
>>> b.group()
‘abc‘

re.findall(pattern, string) 找到所有要匹配的字符並返回列表格式,例如:

>>> re.findall(‘abc‘,‘1abc2abc‘)#註意返回結果是一個列表
[‘abc‘, ‘abc‘]

re.complie(string) 生成要匹配的正則對象,例如:

>>> c=re.compile(‘abc‘)#參數可以是各種正則表達式,提前編譯。
>>> d=c.match(‘abc1abc2abc‘)#匹配時直接調用,提高了性能。
>>> d.group()
‘abc‘

re.sub(pattern, repl, string, count,flag) 替換匹配到的字符,即對字符串string按照pattern匹配,得到的替換為repl,替換個數為countflag表示匹配模式,例如:

>>> re.sub("[0-9]","|", "aaa1bbb2ccc3ddd4eee",count=2 )
‘aaa|bbb|ccc3ddd4eee‘
>>> re.sub("[0-9]","|", "aaa1bbb2ccc3ddd4eee")   #不指定count表示替換所有匹配的
‘aaa|bbb|ccc|ddd|eee‘

flag的類型:

1).re.I(re.IGNORECASE): 忽略大小寫
2).re.M(MULTILINE): 多行模式,改變’^’和’$’的行為
3).re.S(DOTALL): 點任意匹配模式,改變’.’的行為
4).re.L(LOCALE): 使預定字符類 \w \W \b \B \s \S 取決於當前區域設定
5).re.U(UNICODE): 使預定字符類 \w \W \b \B \s \S \d \D 取決於unicode定義的字符屬性
6).re.X(VERBOSE): 詳細模式。這個模式下正則表達式可以是多行,忽略空白字符,並可以加入註釋。

註:

正則表達式實例:

字符匹配

python 匹配 "python".

字符類

[Pp]ython 匹配 "Python" "python"

rub[ye] 匹配 "ruby" "rube"

[aeiou] 匹配中括號內的任意一個字母

[0-9] 匹配任何數字。類似於 [0123456789]

[a-z] 匹配任何小寫字母

[A-Z] 匹配任何大寫字母

[a-zA-Z0-9] 匹配任何字母及數字

[^aeiou] 除了aeiou字母以外的所有字符

[^0-9] 匹配除了數字外的字符

特殊字符類

. 匹配除 "\n" 之外的任何單個字符。要匹配包括 ‘\n‘ 在內的任何字符,請使用象 ‘[.\n]‘ 的模式。

\d 匹配一個數字字符。等價於 [0-9]

\D 匹配一個非數字字符。等價於 [^0-9]

\s 匹配任何空白字符,包括空格、制表符、換頁符等等。等價於 [ \f\n\r\t\v]

\S 匹配任何非空白字符。等價於 [^ \f\n\r\t\v]

\w 匹配包括下劃線的任何單詞字符。等價於‘[A-Za-z0-9_]‘

\W 匹配任何非單詞字符。等價於 ‘[^A-Za-z0-9_]‘

參考練習:

1.批量改名:

目錄下abc_001.txt

abc_002.txt

abc_003.txt

abc_004.txt

abc_005.txt

改名為:001.txt

002.txt

003.txt

004.txt

005.txt

#!/usr/bin/env python
import os
for x,y,z in os.walk("."):
	for i in z:
		a="".join(list(i)[4:])
		os.rename(i,a)

2.隨機生成6個包含大寫字母、小寫字母、數字的字符串:

#!/usr/bin/env python
a=range(65,91)
b=range(97,123)
c=range(48,58)
a.extend(b)
a.extend(c)
import random
c=[]
for i in range(6):
    d=chr (random.sample(a,1)[0])
    c.append(d)
print "".join(c)


本文出自 “網絡技術” 博客,請務必保留此出處http://fengjicheng.blog.51cto.com/11891287/1928788

python筆記--內置模塊