目錄
- 一、 模塊
- 1、模塊的概念
- 2、模塊的兩種導(dǎo)入方式
- 3、模塊的搜索順序[擴(kuò)展]
- 4、 name 屬性
- 二、包
- 三、發(fā)布模塊(知道)
- 1、 制作發(fā)布?jí)嚎s包步驟
- 2、安裝模塊
- 3、pip 安裝第三方模塊
- 四、文件
- 1、文件的基本操作
- 2、文件/目錄的常用管理操作
- 3、Ptyhon 2.x 中如何使用中文
- 五、命名空間和作用域
- 1、dir()函數(shù)
- 2、globals()和locals()函數(shù)
- 3、reload()函數(shù)
一、 模塊
1、模塊的概念
模塊是 Python 程序架構(gòu)的一個(gè)核心概念
- 每一個(gè)以擴(kuò)展名 py 結(jié)尾的 Python 源代碼文件都是一個(gè) 模塊
- 模塊名 同樣也是一個(gè) 標(biāo)識(shí)符,需要符合標(biāo)識(shí)符的命名規(guī)則
- 在模塊中定義的 全局變量 、函數(shù)、類 都是提供給外界直接使用的 工具
- 模塊 就好比是 工具包,要想使用這個(gè)工具包中的工具,就需要先 導(dǎo)入 這個(gè)模塊
2、模塊的兩種導(dǎo)入方式
(1)import 語(yǔ)句
提示:在導(dǎo)入模塊時(shí),每個(gè)導(dǎo)入應(yīng)該獨(dú)占一行
導(dǎo)入之后
- 通過(guò) 模塊名. 使用 模塊提供的工具 —— 全局變量、函數(shù)、類
- 使用 as 指定模塊的別名
import 模塊名1 as 模塊別名
注意:模塊別名 應(yīng)該符合 大駝峰命名法
(2)From…import 語(yǔ)句
- 如果希望 從某一個(gè)模塊 中,導(dǎo)入 部分 工具,就可以使用
from ... import
的方式
- import 模塊名是 一次性把模塊中 所有工具全部導(dǎo)入,并且通過(guò) 模塊名/別名 訪問(wèn)
# 從 模塊 導(dǎo)入 某一個(gè)工具
from 模塊名1 import 工具名
導(dǎo)入之后
- 不需要 通過(guò) 模塊名.
- 可以直接使用 模塊提供的工具 —— 全局變量、函數(shù)、類
注意
兩個(gè)模塊,存在 同名的函數(shù),那么 后導(dǎo)入模塊的函數(shù),會(huì) 覆蓋掉先導(dǎo)入的函數(shù)
開(kāi)發(fā)時(shí) import 代碼應(yīng)該統(tǒng)一寫在 代碼的頂部,更容易及時(shí)發(fā)現(xiàn)沖突
一旦發(fā)現(xiàn)沖突,可以使用 as 關(guān)鍵字 給其中一個(gè)工具起一個(gè)別名
(3)from…import * 語(yǔ)句
# 從 模塊 導(dǎo)入 所有工具
from 模塊名1 import *
注意
這種方式不推薦使用,因?yàn)楹瘮?shù)重名并沒(méi)有任何的提示,出現(xiàn)問(wèn)題不好排查
3、模塊的搜索順序[擴(kuò)展]
Python 的解釋器在 導(dǎo)入模塊 時(shí),會(huì):
- 搜索 當(dāng)前目錄 指定模塊名的文件,如果有就直接導(dǎo)入
- 如果沒(méi)有,再搜索 系統(tǒng)目錄
- 在開(kāi)發(fā)時(shí),給文件起名,不要和 系統(tǒng)的模塊文件 重名
Python 中每一個(gè)模塊都有一個(gè)內(nèi)置屬性 __file__
可以 查看模塊 的 完整路徑
示例
import random
# 生成一個(gè) 0~10 的數(shù)字
rand = random.randint(0, 10)
print(rand)
注意:
- 如果當(dāng)前目錄下,存在一個(gè) random.py 的文件,程序就無(wú)法正常執(zhí)行了!
- 這個(gè)時(shí)候,Python 的解釋器會(huì) 加載當(dāng)前目錄 下的 random.py 而不會(huì)加載 系統(tǒng)的 random 模塊
4、 name 屬性
在實(shí)際開(kāi)發(fā)中,每一個(gè)模塊都是獨(dú)立開(kāi)發(fā)的,大多都有專人負(fù)責(zé)
開(kāi)發(fā)人員 通常會(huì)在 模塊下方 增加一些測(cè)試代碼
僅在模塊內(nèi)使用,而被導(dǎo)入到其他文件中不需要執(zhí)行
- name 屬性可以做到,測(cè)試模塊的代碼 只在測(cè)試情況下被運(yùn)行,而在 被導(dǎo)入時(shí)不會(huì)被執(zhí)行!
- name 是 Python 的一個(gè)內(nèi)置屬性,記錄著一個(gè) 字符串
- 如果 是被其他文件導(dǎo)入的,name 就是 模塊名
- 如果 是當(dāng)前執(zhí)行的程序 name 是 main
在很多 Python 文件中都會(huì)看到以下格式的代碼:
# 導(dǎo)入模塊
# 定義全局變量
# 定義類
# 定義函數(shù)
# 在代碼的最下方
def main():
# ...
pass
# 根據(jù) __name__ 判斷是否執(zhí)行下方代碼
if __name__ == "__main__":
main()
二、包
1、概念
- 包 是一個(gè) 包含多個(gè)模塊 的 特殊
- 目錄目錄下有一個(gè) 特殊的文件
__init__.py
- 包名的 命名方式 和變量名一致,小寫字母 +
- _使用
import 包名
可以一次性導(dǎo)入包中 所有的模塊
2、案例演練
- 新建一個(gè) hm_message 的 包
- 在目錄下,新建兩個(gè)文件 send_message 和 receive_message
- 在 send_message 文件中定義一個(gè) send 函數(shù)
- 在 receive_message 文件中定義一個(gè) receive 函數(shù)
- 在外部直接導(dǎo)入 hm_message 的包
要在外界使用 包 中的模塊,需要在__init__.py
中指定 對(duì)外界提供的模塊列表
# 從 當(dāng)前目錄 導(dǎo)入 模塊列表
from . import send_message
from . import receive_message
三、發(fā)布模塊(知道)
如果希望自己開(kāi)發(fā)的模塊,分享 給其他人,可以按照以下步驟操作
1、 制作發(fā)布?jí)嚎s包步驟
(1)創(chuàng)建 setup.py setup.py 的文件
from distutils.core import setup
setup(name="hm_message", # 包名
version="1.0", # 版本
description="itheima's 發(fā)送和接收消息模塊", # 描述信息
long_description="完整的發(fā)送和接收消息模塊", # 完整描述信息
author="itheima", # 作者
author_email="itheima@itheima.com", # 作者郵箱
url="www.itheima.com", # 主頁(yè)
py_modules=["hm_message.send_message",
"hm_message.receive_message"])
(2) 構(gòu)建模塊
$ python3 setup.py build
3) 生成發(fā)布?jí)嚎s包
$ python3 setup.py sdist
注意:要制作哪個(gè)版本的模塊,就使用哪個(gè)版本的解釋器執(zhí)行!
2、安裝模塊
$ tar -zxvf hm_message-1.0.tar.gz
$ sudo python3 setup.py install
卸載模塊
直接從安裝目錄下,把安裝模塊的 目錄 刪除就可以
$ cd /usr/local/lib/python3.5/dist-packages/
$ sudo rm -r hm_message*
3、pip 安裝第三方模塊
- 第三方模塊 通常是指由 知名的第三方團(tuán)隊(duì) 開(kāi)發(fā)的 并且被 程序員廣泛使用 的 Python 包 / 模塊
- 例如 pygame 就是一套非常成熟的 游戲開(kāi)發(fā)模塊
- pip 是一個(gè)現(xiàn)代的,通用的 Python 包管理工具
- 提供了對(duì) Python 包的查找、下載、安裝、卸載等功能
安裝和卸載命令如下:
# 將模塊安裝到 Python 2.x 環(huán)境
$ sudo pip install pygame
$ sudo pip uninstall pygame
# 將模塊安裝到 Python 3.x 環(huán)境
$ sudo pip3 install pygame
$ sudo pip3 uninstall pygame
在 Mac 下安裝 iPython
$ sudo pip install ipython
在 Linux 下安裝 iPython
$ sudo apt install ipython
$ sudo apt install ipython3
四、文件
1、文件的基本操作
(1)操作文件的套路
在 計(jì)算機(jī) 中要操作文件的套路非常固定,一共包含三個(gè)步驟:
打開(kāi)文件
- 讀、寫文件
- 讀 將文件內(nèi)容讀入內(nèi)存
- 寫 將內(nèi)存內(nèi)容寫入文件
關(guān)閉文件
(2)操作文件的函數(shù)/方法
在 Python 中要操作文件需要記住 1 個(gè)函數(shù)和 3 個(gè)方法
|
序號(hào) |
函數(shù)/方法 |
說(shuō)明 |
01 |
open |
打開(kāi)文件,并且返回文件操作對(duì)象 |
02 |
read |
將文件內(nèi)容讀取到內(nèi)存 |
03 |
write |
將指定內(nèi)容寫入文件 |
04 |
close |
關(guān)閉文件 |
- open 函數(shù)負(fù)責(zé)打開(kāi)文件,并且返回文件對(duì)象
- read/write/close 三個(gè)方法都需要通過(guò) 文件對(duì)象 來(lái)調(diào)用
(3)read 方法 —— 讀取文件
open 函數(shù)的第一個(gè)參數(shù)是要打開(kāi)的文件名(文件名區(qū)分大小寫) 如果文件 存在,返回 文件操作對(duì)象如果文件 不存在,會(huì) 拋出異常 read 方法可以一次性 讀入 并 返回 文件的 所有內(nèi)容close 方法負(fù)責(zé) 關(guān)閉文件(如果忘記關(guān)閉文件,會(huì)造成系統(tǒng)資源消耗,而且會(huì)影響到后續(xù)對(duì)文件的訪問(wèn))
注意:read 方法執(zhí)行后,會(huì)把 文件指針 移動(dòng)到 文件的末尾
# 1. 打開(kāi) - 文件名需要注意大小寫
file = open("README")
# 2. 讀取
text = file.read()
print(text)
# 3. 關(guān)閉
file.close()
提示
在開(kāi)發(fā)中,通常會(huì)先編寫 打開(kāi) 和 關(guān)閉 的代碼,再編寫中間針對(duì)文件的 讀/寫 操作!
(4)文件指針(知道)
- 文件指針 標(biāo)記 從哪個(gè)位置開(kāi)始讀取數(shù)據(jù)
- 第一次打開(kāi) 文件時(shí),通常 文件指針會(huì)指向文件的開(kāi)始位置
- 當(dāng)執(zhí)行了 read 方法后,文件指針 會(huì)移動(dòng)到 讀取內(nèi)容的末尾
- 默認(rèn)情況下會(huì)移動(dòng)到 文件末尾
思考
如果執(zhí)行了一次 read 方法,讀取了所有內(nèi)容,那么再次調(diào)用 read 方法,還能夠獲得到內(nèi)容嗎?
答案
不能 第一次讀取之后,文件指針移動(dòng)到了文件末尾,再次調(diào)用不會(huì)讀取到任何的內(nèi)容
(5)打開(kāi)文件的方式
open 函數(shù)默認(rèn)以 只讀方式 打開(kāi)文件,并且返回文件對(duì)象
語(yǔ)法如下:
|
f = open("文件名", "訪問(wèn)方式")
訪問(wèn)方式 |
說(shuō)明 |
r |
以只讀方式打開(kāi)文件。文件的指針將會(huì)放在文件的開(kāi)頭,這是默認(rèn)模式。如果文件不存在,拋出異常 |
w |
以只寫方式打開(kāi)文件。如果文件存在會(huì)被覆蓋。如果文件不存在,創(chuàng)建新文件 |
a |
以追加方式打開(kāi)文件。如果該文件已存在,文件指針將會(huì)放在文件的結(jié)尾。如果文件不存在,創(chuàng)建新文件進(jìn)行寫入 |
r+ |
以讀寫方式打開(kāi)文件。文件的指針將會(huì)放在文件的開(kāi)頭。如果文件不存在,拋出異常 |
w+ |
以讀寫方式打開(kāi)文件。如果文件存在會(huì)被覆蓋。如果文件不存在,創(chuàng)建新文件 |
a+ |
以讀寫方式打開(kāi)文件。如果該文件已存在,文件指針將會(huì)放在文件的結(jié)尾。如果文件不存在,創(chuàng)建新文件進(jìn)行寫入 |
提示
頻繁的移動(dòng)文件指針,會(huì)影響文件的讀寫效率,開(kāi)發(fā)中更多的時(shí)候會(huì)以 只讀、只寫 的方式來(lái)操作文件
寫入文件示例
# 打開(kāi)文件
f = open("README", "w")
f.write("hello python!\n")
f.write("今天天氣真好")
# 關(guān)閉文件
f.close()
(6) 按行讀取文件內(nèi)容
- read 方法默認(rèn)會(huì)把文件的 所有內(nèi)容 一次性讀取到內(nèi)存
- 如果文件太大,對(duì)內(nèi)存的占用會(huì)非常嚴(yán)重
- readline 方法可以一次讀取一行內(nèi)容
- 方法執(zhí)行后,會(huì)把 文件指針 移動(dòng)到下一行,準(zhǔn)備再次讀取
- 讀取大文件的正確姿勢(shì)
# 打開(kāi)文件
file = open("README")
while True:
# 讀取一行內(nèi)容
text = file.readline()
# 判斷是否讀到內(nèi)容
if not text:
break
# 每讀取一行的末尾已經(jīng)有了一個(gè) `\n`
print(text, end="")
# 關(guān)閉文件
file.close()
(7) 文件讀寫案例 —— 復(fù)制文件
目標(biāo)
用代碼的方式,來(lái)實(shí)現(xiàn)文件復(fù)制過(guò)程
小文件復(fù)制
打開(kāi)一個(gè)已有文件,讀取完整內(nèi)容,并寫入到另外一個(gè)文件
# 1. 打開(kāi)文件
file_read = open("README")
file_write = open("README[復(fù)件]", "w")
# 2. 讀取并寫入文件
text = file_read.read()
file_write.write(text)
# 3. 關(guān)閉文件
file_read.close()
file_write.close()
大文件復(fù)制
打開(kāi)一個(gè)已有文件,逐行讀取內(nèi)容,并順序?qū)懭氲搅硗庖粋€(gè)文件
# 1. 打開(kāi)文件
file_read = open("README")
file_write = open("README[復(fù)件]", "w")
# 2. 讀取并寫入文件
while True:
# 每次讀取一行
text = file_read.readline()
# 判斷是否讀取到內(nèi)容
if not text:
break
file_write.write(text)
# 3. 關(guān)閉文件
file_read.close()
file_write.close()
2、文件/目錄的常用管理操作
- 在 終端 / 文件瀏覽器、 中可以執(zhí)行常規(guī)的 文件 / 目錄 管理操作,例如:
- 創(chuàng)建、重命名、刪除、改變路徑、查看目錄內(nèi)容、……
- 在 Python 中,如果希望通過(guò)程序?qū)崿F(xiàn)上述功能,需要導(dǎo)入 os 模塊
文件操作
序號(hào) |
方法名 |
說(shuō)明 |
示例 |
01 |
rename |
重命名文件 os.rename(源文件名, 目標(biāo)文件名) |
|
02 |
remove |
刪除文件 os.remove(文件名) |
目錄操作
序號(hào) |
方法名 |
說(shuō)明 |
示例 |
01 |
listdir |
目錄列表 |
os.listdir(目錄名) |
02 |
mkdir |
創(chuàng)建目錄 |
os.mkdir(目錄名) |
03 |
rmdir |
刪除目錄 |
os.rmdir(目錄名) |
04 |
getcwd |
獲取當(dāng)前目錄 |
os.getcwd() |
05 |
chdir |
修改工作目錄 |
os.chdir(目標(biāo)目錄) |
06 |
path.isdir |
判斷是否是文件 |
os.path.isdir(文件路徑) |
提示:文件或者目錄操作都支持 相對(duì)路徑 和 絕對(duì)路徑
3、Ptyhon 2.x 中如何使用中文
在 Python 2.x 文件的 第一行 增加以下代碼,解釋器會(huì)以 utf-8 編碼來(lái)處理 python 文件
# *-* coding:utf8 *-*
這方式是官方推薦使用的!
也可以使用
# coding=utf8
unicode 字符串
- 在 Python 2.x 中,即使指定了文件使用 UTF-8 的編碼格式,但是在遍歷字符串時(shí),仍然會(huì) 以字節(jié)為單位遍歷 字符串
- 要能夠 正確的遍歷字符串,在定義字符串時(shí),需要 在字符串的引號(hào)前,增加一個(gè)小寫字母 u,告訴解釋器這是一個(gè) unicode 字符串(使用 UTF-8 編碼格式的字符串)
# *-* coding:utf8 *-*
# 在字符串前,增加一個(gè) `u` 表示這個(gè)字符串是一個(gè) utf8 字符串
hello_str = u"你好世界"
print(hello_str)
for c in hello_str:
print(c)
五、命名空間和作用域
變量是擁有匹配對(duì)象的名字(標(biāo)識(shí)符)。命名空間是一個(gè)包含了變量名稱們(鍵)和它們各自相應(yīng)的對(duì)象們(值)的字典。
一個(gè)Python表達(dá)式可以訪問(wèn)局部命名空間和全局命名空間里的變量。如果一個(gè)局部變量和一個(gè)全局變量重名,則局部變量會(huì)覆蓋全局變量。
- 每個(gè)函數(shù)都有自己的命名空間。類的方法的作用域規(guī)則和通常函數(shù)的一樣。
- Python會(huì)智能地猜測(cè)一個(gè)變量是局部的還是全局的,它假設(shè)任何在函數(shù)內(nèi)賦值的變量都是局部的。
因此,如果要給全局變量在一個(gè)函數(shù)里賦值,必須使用global語(yǔ)句。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
Money = 2000
def AddMoney():
# 想改正代碼就取消以下注釋:
# global Money
Money = Money + 1
print Money
AddMoney()
print Money
1、dir()函數(shù)
dir()函數(shù)一個(gè)排好序的字符串列表,內(nèi)容是一個(gè)模塊里定義過(guò)的名字。
返回的列表容納了在一個(gè)模塊里定義的所有模塊,變量和函數(shù)。如下一個(gè)簡(jiǎn)單的實(shí)例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 導(dǎo)入內(nèi)置math模塊
import math
content = dir(math)
print content;
以上實(shí)例輸出結(jié)果:
['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan',
'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp',
'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh',
'sqrt', 'tan', 'tanh']
在這里,特殊字符串變量__name__指向模塊的名字,__file__指向該模塊的導(dǎo)入文件名。
2、globals()和locals()函數(shù)
- 根據(jù)調(diào)用地方的不同,**globals()和locals()**函數(shù)可被用來(lái)返回全局和局部命名空間里的名字。
- 如果在函數(shù)內(nèi)部調(diào)用locals(),返回的是所有能在該函數(shù)里訪問(wèn)的命名。
- 如果在函數(shù)內(nèi)部調(diào)用globals(),返回的是所有在該函數(shù)里能訪問(wèn)的全局名字。
- 兩個(gè)函數(shù)的返回類型都是字典。所以名字們能用keys()函數(shù)摘取。
3、reload()函數(shù)
當(dāng)一個(gè)模塊被導(dǎo)入到一個(gè)腳本,模塊頂層部分的代碼只會(huì)被執(zhí)行一次。
因此,如果你想重新執(zhí)行模塊里頂層部分的代碼,可以用reload()函數(shù)。該函數(shù)會(huì)重新導(dǎo)入之前導(dǎo)入過(guò)的模塊。語(yǔ)法如下:
reload(module_name)
在這里,module_name要直接放模塊的名字,而不是一個(gè)字符串形式。比如想重載hello模塊,如下:
reload(hello)
到此這篇關(guān)于五分鐘學(xué)會(huì)Python 模塊和包、文件的文章就介紹到這了,更多相關(guān)Python 模塊和包、文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Python如何將模塊打包并發(fā)布
- python 制作python包,封裝成可用模塊教程
- Python包和模塊的分發(fā)詳細(xì)介紹
- Python安裝依賴(包)模塊方法詳解
- Python--模塊(Module)和包(Package)詳解