Python模塊基礎

模塊

  • 文件是python在物理上組織代碼的形式
  • 模塊是python在邏輯上組織代碼的形式
  • 每一個以.py結尾的python文件就是一個模塊。將.py擴展名移除後的文件名就是模塊名

1)創建模塊

[root@localhost day03] vim star.py
hi = 'Hello World!'

def pstar(n=30):
    print('*' * n)

[root@localhost day03] python3
>>> import star
>>> star.hi
'Hello World!'
>>> star.pstar()
******************************

[root@localhost day03] vim a.py
import star

print(star.hi)
star.pstar(50)

[root@localhost day03] python3 a.py
Hello World!
**************************************************

2)導入模塊的方法

>>> import sys    # 常用
>>> from random import randint, choice   # 常用,導入一部分方法
>>> randint(1, 100)
3
>>> choice('abcd')
'c'
>>> import time, os, string  # 一行導入多個模塊,不推薦
>>> import pickle as p       # 導入模塊時,爲其起別名,不常用

3)加載(load)

  • 一個模塊只被加載一次,無論它被入多少次
  • 只加載一次可以阻止多重導入時代碼被多次執行
  • 如果兩個文件相互導入,防止了無限的相互加載
  • 模塊加載時,頂層代碼會自動執行,所以只將函數放入模塊的頂層是良好的編程習慣
>>> import this   # 打印the zone of python
>>> import this   # 不會再打印,因爲只有第一次import會觸發load行爲

4)模塊導入的特性

  • 需求:某些代碼在程序文件直接運行時執行;當程序文件被當作模塊導入時不執行
  • 特特殊屬性__name__它是一個變量,它有兩種值
    • 當程序文件直接運行時,它的值是__main__
    • 當程序文件被當作模塊導入時,它的值是模塊名
[root@localhost day03]# vim foo.py
print(__name__)
[root@localhost day03]# vim bar.py
import foo
[root@localhost day03]# python3 foo.py
__main__
[root@localhost day03]# python3 bar.py
foo
if __name__ == '__main__':   # 僅當此腳本直接運行時才執行語句。輸入main可以自動補全該語句
	print('aaaaa')    

random

>>> import random
>>> random.choice('abc')   # 隨機選一個字符
'a'
>>> random.choice('abc')
>>> random.choice(('aaaa', 'bbb', 'ccc'))    # 隨機選一個單詞
'bbb'
>>> random.choice(('aaaa', 'bbb', 'ccc'))
'bbb'
>>> random.choice(('aaaa', 'bbb', 'ccc'))
'aaaa'
>>> random.randint(1, 100)  # 隨機產生1-100內的數字,包括1和100
53
>>> random.randint(1, 100)
12

shutil

import shutil
>>> shutil.copy('/etc/hosts', '/tmp/zj2.txt')   # cp /etc/hosts /tmp/zj2.txt
>>> shutil.move('/tmp/zj.txt', '/var/tmp')      # mv /tmp/zj.txt /var/tmp
>>> shutil.copytree('/etc/security', '/tmp/anquan')  # cp -r
>>> shutil.rmtree('/tmp/anquan')   # rm -rf /tmp/anquan 
# chown student:student /tmp/zj2.txt
>>> shutil.chown('/tmp/zj2.txt', user='student', group='student')

subprocess

  • subprocess模塊主要用於執行系統命令
  • subprocess模塊允許你產生新的進程,連接到它們的輸入/輸出/錯誤管道,並獲得它們的返回代碼
>>> import subprocess
>>> subprocess.run(['ls', '/home'])
CompletedProcess(args=['ls', '/home'], returncode=0)
>>> subprocess.run(['ls', '/root'])
05  1.py  test  zhuji
CompletedProcess(args=['ls', '/root'], returncode=0)
>>> subprocess.run('ls')
test  05  1.py
CompletedProcess(args='ls', returncode=0)
>>> subprocess.run('ls ~', shell=True)  #使用shell環境運行
05  1.py  nsd2019  test  zhuji
CompletedProcess(args='ls ~', returncode=0)
>>> a = subprocess.run('ls ~', shell =True)  #無法直接保存輸出結果
05  1.py  nsd2019  test  zhuji
>>> a 
CompletedProcess(args='ls ~', returncode=0)
>>> a = subprocess.run('ls ~', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)   #定義屬性保存,當固定格式使用
>>> a 
CompletedProcess(args='ls ~', returncode=0, stdout=b'05\n1.py\ntest\nzhuji\n', stderr=b'')
>>> a.stdout
b'05\n1.py\nnsd2019\ntest\nzhuji\n'
>>> print(a.stdout.decode())
05
1.py
test
zhuji

time

  • 時間戳:自1970年1月1日0時到某一個時間點之間的秒數
  • UTC時間:世界協調時。
>>> time.time()        # 時間戳
1584495297.0802724
>>> time.sleep(3)      # 相當於shell中的sleep 3
>>> time.ctime()       # UTC
'Wed Mar 18 09:36:50 2020'
>>> time.localtime()   # struct_time9元組
time.struct_time(tm_year=2020, tm_mon=3, tm_mday=18, tm_hour=9, tm_min=37, tm_sec=14, tm_wday=2, tm_yday=78, tm_isdst=0)
>>> t1 = time.localtime()
>>> t1.tm_mday         # 今天的日期
18
>>> t1.tm_yday         # 今天是今年的第幾天
78
>>> time.strftime('%Y-%m-%d %a %H:%M:%S')  # 返回當前時間的自定義字符串形式
'2020-03-18 Wed 09:41:07'
# 可以將時間字符串轉成相應的9元組形式
>>> t2 = time.strptime('2019-3-10 12:30:00', '%Y-%m-%d %H:%M:%S')

在這裏插入圖片描述

  • 過濾日誌文件
import time

logfile = 'mylog.log'
# 取出日誌文件的每一行,判斷時間,如果是9點到12點之間的,則打印
t9 = time.strptime('2019-05-15 09:00:00', '%Y-%m-%d %H:%M:%S')
t12 = time.strptime('2019-05-15 12:00:00', '%Y-%m-%d %H:%M:%S')

with open(logfile) as fobj:
    for line in fobj:
        t = time.strptime(line[:19], '%Y-%m-%d %H:%M:%S')
        # if t9 <= t <= t12:
        #     print(line, end='')
        if t > t12:
            break
        if t > t9:
            print(line, end='')

datetime

>>> from datetime import datetime
>>> datetime.now()   # 返回當前的時間對象: 年,月,日,時,分,秒,毫>秒
datetime.datetime(2020, 3, 18, 10, 48, 16, 934977)
>>> t.year, t.month, t.day, t.hour, t.minute, t.second, t.microsecond
(2020, 3, 18, 10, 49, 16, 189267)
>>> t.strftime('%Y-%m-%d %H:%M:%S')   # 把datetime對象轉成指定格式的字符串
'2020-03-18 10:49:16'
# 把字符串轉成datetime對象
>>> datetime.strptime('2050-1-1 0:00:00', '%Y-%m-%d %H:%M:%S')
datetime.datetime(2050, 1, 1, 0, 0)

# 計算100天1小時之前、之後的時間
>>> from datetime import datetime, timedelta
>>> days = timedelta(days=100, hours=1)
>>> t = datetime.now()
>>> t + days
datetime.datetime(2020, 6, 26, 12, 19, 17, 90805)
>>> t - days
datetime.datetime(2019, 12, 9, 10, 19, 17, 90805)
  • 過濾日誌文件
from datetime import datetime

logfile = 'mylog.log'
# 取出日誌文件的每一行,判斷時間,如果是9點到12點之間的,則打印
t9 = datetime.strptime('2019-05-15 09:00:00', '%Y-%m-%d %H:%M:%S')
t12 = datetime.strptime('2019-05-15 12:00:00', '%Y-%m-%d %H:%M:%S')

with open(logfile) as fobj:
    for line in fobj:
        t = datetime.strptime(line[:19], '%Y-%m-%d %H:%M:%S')
        if t > t12:
            break
        if t > t9:
            print(line, end='')

os

>>> os.getcwd()   # pwd
'/root/nsd2019/nsd1910/py02/day01'
>>> os.listdir()  # ls
>>> os.listdir('/tmp')  # ls /tmp
>>> os.mkdir('/tmp/demo')  # mkdir /tmp/demo
>>> os.mkdir('/tmp/nsd1910/demo')  # 報錯,不能創建層級目錄
>>> os.makedirs('/tmp/nsd1910/demo')  # mkdir -p /tmp/nsd1910/demo
>>> os.chdir('/tmp/demo')  # cd /tmp/demo
>>> os.environ['PATH']   # 取出環境變量PATH的值
'/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:/root/bin'

>>> os.listdir()
[]
>>> import shutil
>>> shutil.copy('/etc/hosts', '.')
'./hosts'
>>> shutil.copytree('/etc/security', 'anquan')
'anquan'
>>> os.symlink('/etc/passwd', 'mima')  # ln -s /etc/passwd mima
>>> os.mknod('mytest')  # touch mytest
>>> os.listdir()
['hosts', 'anquan', 'mima', 'mytest']
>>> os.rename('mytest', 'mytest.txt')
>>> os.listdir()
['hosts', 'anquan', 'mima', 'mytest.txt']

# Linux的權限數字是8進制數
>>> os.chmod('hosts', 0o755)
>>> os.chmod('hosts', 0o644)
>>> shutil.rmtree('anquan')   # rm -rf anquan
>>> os.remove('hosts')        # rm -f hosts
>>> os.rmdir('/tmp/nsd1910/demo')   # 只能刪除空目錄
>>> os.stat('/etc/hosts')  # 查看文件狀態,相當於 stat /etc/hosts
os.stat_result(st_mode=33188, st_ino=67160698, st_dev=64768, st_nlink=1, st_uid=0, st_gid=0, st_size=158, st_atime=1584492969, st_mtime=1370615492, st_ctime=1580547233)
>>> a = os.stat('/etc/hosts')
>>> a.st_size   # 取出文件大小的字節數
158

>>> os.listdir()
['mima', 'mytest.txt']
>>> os.path.abspath('mytest.txt')   # 返回絕對路徑
'/tmp/demo/mytest.txt'
>>> os.path.basename('/tmp/demo/mytest.txt')  # 返回最右面一個/後面的內容
'mytest.txt'
>>> os.path.dirname('/tmp/demo/mytest.txt')  # 返回最右面一個/前面的內容
'/tmp/demo'
>>> os.path.split('/tmp/demo/mytest.txt')
('/tmp/demo', 'mytest.txt')
>>> os.path.join('/tmp/demo', 'mytest.txt')
'/tmp/demo/mytest.txt'
>>> os.path.splitext('hello.txt')  # 切出擴展名
('hello', '.txt')

>>> os.path.isabs('/sss/aaa/ccc/')  # 是絕路徑的格式嗎?
True
>>> os.path.isdir('/etc')   # 存在並且是目錄嗎?
True
>>> os.path.isfile('/etc')  # 存在並且是文件嗎?
False
>>> os.path.islink('/etc/grub2.cfg')  # 存在並且是軟鏈接嗎?
True
>>> os.path.ismount('/')  # 存在並且是掛點嗎?
True
>>> os.path.exists('/tmp/xyz.txt')  # 存在嗎?
False
  • os.walk方法
[root@localhost demo] cp /etc/{hosts,passwd,issue} .
[root@localhost demo] touch aaa/{a,b,c}.txt
[root@localhost demo] touch bbb/{d,e}.doc
[root@localhost demo] touch ccc/{f,g}.jpg
[root@localhost demo] ls -R /tmp/demo/
/tmp/demo/:
aaa  bbb  ccc  hosts  issue  passwd

/tmp/demo/aaa:
a.txt  b.txt  c.txt

/tmp/demo/bbb:
d.doc  e.doc

/tmp/demo/ccc:
f.jpg  g.jpg

>>> list(os.walk('/tmp/demo'))
>>> a = list(os.walk('/tmp/demo'))
>>> len(a)
4
>>> a[0]
('/tmp/demo', ['aaa', 'bbb', 'ccc'], ['hosts', 'passwd', 'issue'])
>>> a[1]
('/tmp/demo/aaa', [], ['a.txt', 'b.txt', 'c.txt'])
>>> a[2]
('/tmp/demo/bbb', [], ['d.doc', 'e.doc'])
>>> a[3]
('/tmp/demo/ccc', [], ['f.jpg', 'g.jpg'])
# os.walk是由多個元組構成的
# 每個元組有三項: (路徑字符串,該路徑下目錄列表,該路徑下文件列表)
# 模擬ls -R
import os
for _path, _dir, _file in list(os.walk('/tmp/demo')):
    print(_path)
    for d in _dir:
        print('\033[34;1m%s\033[0m' % d, end='\t')
    for f in _file:
        print(f, end='\t')
    print('\n')
    
# 效果:
/tmp/demo:
aaa     bbb     ccc     hosts   passwd  issue

/tmp/demo/aaa:
a.txt   b.txt   c.txt

/tmp/demo/bbb:
d.doc   e.doc

/tmp/demo/ccc:
f.jpg   g.jpg

pickle

  • 普通的文件操作,只能把str或bytes類型數據寫入文件
  • pickle模塊可以把任意的數據類型存到文件中,還可以無損地取出來
>>> import pickle
>>> shopping_list = ['fbm', 'sj', 'pg']
>>> with open('/tmp/a.data', 'wb') as fobj:
...   pickle.dump(shopping_list, fobj)

>>> import pickle
>>> with open('/tmp/a.data', 'rb') as fobj:
...   l1 = pickle.load(fobj)
...
>>> type(l1)
<class 'list'>
>>> l1
['fbm', 'sj', 'pg']
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章