1. 程式人生 > >Python 之 模塊

Python 之 模塊

就是 都是 存在 表達式 駝峰 input 而且 list 進行

1. 模塊

1.1 概念

  • 每一個以擴展名 .py 結尾的 Python 源代碼文件都是一個模塊;
  • 模塊名同樣也是一個標識符,需要符合標識符的命名規則;
  • 在模塊中定義的全局變量, 函數, 類都是提供給外界直接使用的工具;

1.2 模塊的兩種導入方式

  • import 導入
  • from...import 導入
# 示例: import 導入
import 模塊名1
import 模塊名2


# 備註: 如果模塊的名字太長,可以使用as指定模塊的名稱,以方便在代碼中的使用
import 模塊名1 as 模塊別名(模塊別名應該符合大駝峰命名法)


# 示例二: from ... import
# 如果希望從某一個模塊中,導入部分工具,就可以使用 from ... import 的方式
from 模塊名1 import 工具名

# 導入之後,不需要通過 模塊名.
# 可以直接使用模塊提供的工具(即全局變量,函數, 類)
# 如果兩個模塊,存在同名的函數,那麽後導入模塊的函數,會覆蓋掉先導入的函數;

1.3 開發原則

  • __name__屬性:測試模塊的代碼只在測試情況下被運行,而在被導入時,不會被執行!
  • __name__記錄著一個字符串:
    • 如果是被其他文件導入的, __name__就是模塊名;
    • 如果是當前執行的程序, __name____main__;
# 示例: 代碼格式
# 1. 導入模塊
# 2. 定義全局變量
# 3. 定義類
# 4. 定義函數

# 在代碼的最下方
def main():
    # 編寫測試代碼
    pass

# 根據 __name__ 的值,判斷是否執行下方代碼
if __name__ = "__main__":
    main()

1.4 包(Package)

  • 包就是一個包含多個模塊的特殊目錄;
  • 目錄下,有一個特殊的文件 __init__.py;
  • 包的命名方式和變量名一致;
  • 使用 import 包名 可以一次性導入包中所有的模塊;
  • __init__.py中需要指定對外界提供的模塊列表;
# 示例:
# 從 當前目錄 導入 模塊列表
from . import 模塊1
from . import 模塊2

1.5 發布模塊

# 具體步驟(三步):
# 1) 創建 setup.py
from distutils.core import setup

setup(name="xxx_message", # 包名
      version="1.0", # 版本
      description="消息模塊", # 描述信息
      long_description="詳細的描述信息", # 完整描述信息
      author="noodles", # 作者
      author_email="[email protected]", # 作者郵箱
      url="www.google.com", # 主頁
      py_modulse=["模塊1",
                  "模塊2"])

# 2) 構建模塊
$ python3 setup.py build

# 3) 生成發布壓縮包
$ python3 setup.py sdist

1.6 安裝模塊

  • 模塊(包).__file__: 可以查看模塊(包)的完整路徑;
# 安裝模塊
$ tar -zxvf 模塊壓縮包
$ sudo python3 setup.py install

# 卸載模塊,直接從安裝目錄下刪除
$ cd /usr/local/lib/python3.5/dist-packages/
$ sudo rm -r 包名

1.7 pip 安裝第三方模塊

  • pip是一個現代的,通用的 Python 包管理工具;
  • 提供了對 Python 包的查找,下載,安裝和卸載等功能;
# 將 pygame 模塊安裝到 python2.x 環境
$ sudo pip install pygame
$ sudo pip uninstall pygame

# 將 pygame 模塊安裝到 Python 3.x 環境
$ sudo pip3 install pygame
$ sudo pip3 uninstall pygame

# mac 下安裝 iPython
$ sudo pip install ipython   # 針對 python2.x
$ sudo pip3 install ipython  # 針對 python3.x

2. 文件操作

2.1 操作文件的函數/方法

  • open函數,負責打開文件,並且返回文件操作對象;
  • read方法,將文件內容讀取到內存;
  • write方法,將指定內容寫入文件;
  • close方法,關閉文件;
  • 以上三個方法均需要通過文件對象來調用;

2.2 read方法--讀取文件

  • open函數的第一個參數就是要打開的文件名(文件名區分大小寫)
    • 如果文件存在,返回文件操作對象;
    • 如果文件不存在,會拋出異常;
  • read方法可以一次性讀入並返回文件的所有內容;
  • close方法負責關閉文件;
  • 如果忘記關閉文件,會造成系統資源消耗,而且會影響到後續對文件的訪問;
# 示例:
# 打開
file = open("a.txt")

# 讀取
text = file.read()
print(text)

# 關閉
file.close()

2.3 文件指針

  • 文件指針標記從哪個位置開始讀取數據;
  • 第一次打開文件時,通常文件指針會指向文件的開始位置;
  • 當執行了 read 方法後,文件指針會移動到讀取內容的末尾;

2.4 打開文件的方式

  • open函數默認以只讀方式打開文件,並且返回文件對象
f = open("文件名", "訪問方式")

# 訪問方式說明:
# r: 以只讀方式打開文件;文件的指針將會放在文件的開頭,這是默認模式;
# w: 以只寫方式打開文件,如果文件存在會被覆蓋;如果文件不存在,創建新文件;
# a: 以追加方式打開文件,如果該文件已經存在,文件指針將會放在文件的末尾; 如果文件不存在,創建新的文件進行寫入;
# r+: 以讀寫方式打開文件;文件的指針將會放在文件的開頭;如果文件不存在,拋出異常;
# w+: 以讀寫方式打開文件;如果文件存在會被覆蓋;如果文件不存在,創建新文件;
# a+: 以讀寫方式打開文件;如果該文件已經存在,文件指針將會放在文件的末尾; 如果文件不存在,創建新的文件進行寫入;

# 備註:頻繁的移動文件指針,會影響文件的讀寫效率;開發中,更多的時候會以只讀,只寫的方式來操作文件;
# a(append)

2.5 按行讀取文件內容

  • readline方法可以一次讀取一行內容;
  • 方法執行後,會把文件指針移動到下一行,準備再次讀取;
  • read方法默認會把文件的所有內容一次性讀取到內存。如果文件太大,對內存的占用會非常嚴重;
# 打開文件
file = open("a.txt")

while True:
    # 讀取一行內容
    text = file.readline()

    # 判斷是否讀到內容
    if not text:
        break

    # 沒讀取一行的末尾已經有一個 '\n'
    print(text, end="")

# 關閉文件
file.close()


# 示例: 文件復制
# 1. 打開文件
file_read = open("a.txt")
file_write = open("b.txt", "w")

# 2. 讀 寫
while True:
    # 讀取到一行內容
    text = file_read.readline()

    # 判斷是否讀取到內容
    if not text:
        break

    file_write.write(text)

# 3. 關閉
file_read.close()
file_write.close()

2.6 文件/目錄的常用管理操作

  • 需要導入 os 模塊
  • os.rename(源文件名, 目標文件名): 重命名;
  • os.remove(文件名): 刪除文件;
  • os.listdir(目錄名): 目錄列表;
  • os.mkdir(目錄名): 創建目錄;
  • os.rmdir(目錄名): 刪除目錄;
  • os.getcwd(): 獲取當前目錄;
  • os.chdir(目標目錄): 修改工作目錄;
  • os.path.isdir(文件路徑): 判斷是否是文件;

3. eval()函數

  • eval()函數,可以將字符串當成有效的表達式來求值,並返回計算結果
  • eval("1 + 1"), 輸出結果: 2
# 示例: 計算器

# 提示用戶輸入一個加減乘除混合運算表達式
input_str = input("請輸入一個算術題: ")

print(eval(input_str))

# 備註: 開發時,千萬不要使用 eval() 函數,直接轉換 input 的結果
# 原因:類似於"註入攻擊"

# 當用戶輸入: __import__('os').system('ls')
# 等價於:
import os
os.system("終端命令")


  • 模塊相關(Python)

Python 之 模塊