Python基础:模块、包与文件操作详解
本文详细解析Python中的模块与包概念,涵盖import与from...import导入方式、__name__属性及模块搜索顺序。深入讲解文件打开、读取(read/readline)、写入及关闭的标准流程,结合os模块介绍文件目录管理,并简述模块发布与pip安装第三方库的方法,帮助开发者掌握Python核心工程化技能。
一、 模块
1、模块的概念
模块构成了 Python 程序架构的核心基础。
- 任何以 .py 为扩展名的 Python 源代码文件,均可视为一个独立的模块。
- 模块的名称本质上是一个标识符,必须严格遵循 Python 的标识符命名规范。
- 在模块内部定义的全局变量、函数以及类,均作为外部可直接调用的资源接口。
- 可以将模块理解为一种“工具库”,使用其中的功能前,必须先执行导入操作。
2、模块的两种导入方式
(1)使用 import 语句
import 模块名1, 模块名2
建议:每次导入模块时,应单独占用一行代码。
import 模块名1
import 模块名2
导入操作完成后:
- 通过“模块名.”的语法格式,调用模块暴露的全局变量、函数或类。
- 也可使用 as 关键字为模块指定别名,以简化调用。
import 模块名1 as 模块别名
注意:模块别名 应该符合 大驼峰命名法
(2)使用 From…import 语句
- 若仅需从特定模块中引入部分功能,可采用
from ... import语法。 - import 模块名 会一次性加载该模块的所有功能,并通过“模块名/别名.”进行访问。
# 从 模块 导入 某一个工具
from 模块名1 import 工具名
导入完成后:
- 无需再使用“模块名.”前缀。
- 可直接调用模块提供的全局变量、函数或类。
注意
若两个被导入的模块包含同名函数,后导入的函数将覆盖先导入的函数定义。
开发规范建议将所有 import 语句统一置于代码顶部,以便快速识别潜在冲突。
若发现命名冲突,可使用 as 关键字为其中一个工具定义别名以解决。
(3)from…import * 语句
# 从 模块 导入 所有工具
from 模块名1 import *
注意
不推荐使用此方式,因函数重名时不会发出警告,导致问题排查困难。
3、模块的搜索顺序[扩展]
Python 解释器在导入模块时,遵循以下查找逻辑:
- 首先搜索当前目录中指定模块名的文件,若存在则直接导入。
- 若当前目录未找到,则继续搜索系统预设的模块目录。
- 开发时,应避免将自定义文件命名为与系统内置模块相同的名称。
每个 Python 模块均内置有 __file__ 属性,用于查看该模块的完整加载路径。
示例
import random
# 生成一个 0~10 的数字
rand = random.randint(0, 10)
print(rand)
注意:
- 若当前目录下存在名为 random.py 的文件,程序执行将异常。
- 此时 Python 解释器会优先加载当前目录下的 random.py,而忽略系统内置的 random 模块。
4. __name__ 属性
在实际开发中,模块通常由专人独立编写,模块末尾常包含用于测试的代码。这些代码仅在模块内部运行时有效,导入其他文件时不应执行。
- __name__ 属性可实现测试代码仅在本地运行,而在被导入时不执行的效果。
- __name__ 是 Python 的内置属性,记录着一个字符串值。
- 若模块被其他文件导入,__name__ 的值即为模块名。
- 若模块是当前执行的入口程序,__name__ 的值为 __main__。
在多数 Python 文件中,可见如下标准代码结构:
# 导入模块
# 定义全局变量
# 定义类
# 定义函数
# 在代码的最下方
def main():
# ...
pass
# 根据 __name__ 判断是否执行下方代码
if __name__ == "__main__":
main()
二、包
1、概念
- 包是一种包含多个模块的特殊目录结构。
- 包目录下必须包含一个特殊文件
__init__.py。 - 包的命名规则与变量名一致,采用小写字母加下划线。
- 使用
import 包名可一次性导入包内所有模块。
2、案例演练
- 创建一个名为 hm_message 的包。
- 在该目录下新建两个文件:send_message 和 receive_message。
- 在 send_message 文件中定义一个 send 函数。
- 在 receive_message 文件中定义一个 receive 函数。
- 在外部直接导入 hm_message 包。
若需从外界访问包内的模块,必须在 __init__.py 中明确指定对外提供的模块列表。
# 从 当前目录 导入 模块列表
from . import send_message
from . import receive_message
三、发布模块(了解)
若希望将自己开发的模块分享给他人,可遵循以下步骤操作。
1、 制作发布压缩包步骤
(1)创建 setup.py 文件。
from distutils.core import setup
setup(name="hm_message", # 包名
version="1.0", # 版本
description="itheima's 发送和接收消息模块", # 描述信息
long_description="完整的发送和接收消息模块", # 完整描述信息
author="itheima", # 作者
author_email="itheima@itheima.com", # 作者邮箱
url="www.itheima.com", # 主页
py_modules=["hm_message.send_message",
"hm_message.receive_message"])
(2)构建模块。
$ python3 setup.py build
3) 生成发布压缩包
$ python3 setup.py sdist
注意:构建哪个版本的模块,必须使用对应版本的解释器执行!
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 安装第三方模块
- 第三方模块通常指由知名第三方团队开发并被广泛使用的 Python 包或模块。
- 例如 pygame 是一套成熟的游戏开发模块。
- pip 是现代通用的 Python 包管理工具。
- 它提供了对 Python 包的查找、下载、安装及卸载等功能。
安装和卸载命令如下:
# 将模块安装到 Python 2.x 环境
$ sudo pip install pygame
$ sudo pip uninstall pygame
# 将模块安装到 Python 3.x 环境
$ 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)操作文件的通用流程
在计算机中操作文件遵循固定套路,共包含三个步骤:
第一步:打开文件。
- 第二步:读、写文件。
- 读:将文件内容载入内存。
- 写:将内存中的数据写入文件。
第三步:关闭文件。
(2)操作文件的函数/方法
在 Python 中操作文件需掌握 1 个函数和 3 个方法。
| 序号 | 函数/方法 | 说明 |
|---|---|---|
| 01 | open | 打开文件,并且返回文件操作对象 |
| 02 | read | 将文件内容读取到内存 |
| 03 | write | 将指定内容写入文件 |
| 04 | close | 关闭文件 |
- open 函数负责打开文件,并返回文件对象。
- read/write/close 三个方法均需通过文件对象进行调用。
(3)read 方法 —— 读取文件
open 函数的第一个参数为文件名(区分大小写);若文件存在,返回文件操作对象;若不存在,则抛出异常。read 方法可一次性读取并返回文件的全部内容。close 方法负责关闭文件(若忘记关闭,会导致系统资源消耗,并影响后续文件访问)。
注意:read 方法执行后,文件指针将移动至文件末尾。
# 1. 打开 - 文件名需要注意大小写
file = open("README")
# 2. 读取
text = file.read()
print(text)
# 3. 关闭
file.close()
提示
在开发中,通常会先编写 打开 和 关闭 的代码,再编写中间针对文件的 读/写 操作!
(4)文件指针(了解)
- 文件指针标记从何处开始读取数据。
- 首次打开文件时,文件指针通常指向文件起始位置。
- 执行 read 方法后,文件指针将移动至读取内容的末尾。
- 默认情况下,指针会移动至文件末尾。
思考
如果执行了一次 read 方法,读取了所有内容,那么再次调用 read 方法,还能够获得到内容吗?答案
不能 第一次读取之后,文件指针移动到了文件末尾,再次调用不会读取到任何的内容
(5)打开文件的方式
open 函数默认以只读方式打开文件,并返回文件对象。
语法如下:
f = open("文件名", "访问方式")
| 访问方式 | 说明 |
|---|---|
| r | 以只读方式打开文件。文件的指针将会放在文件的开头,这是默认模式。如果文件不存在,抛出异常 |
| w | 以只写方式打开文件。如果文件存在会被覆盖。如果文件不存在,创建新文件 |
| a | 以追加方式打开文件。如果该文件已存在,文件指针将会放在文件的结尾。如果文件不存在,创建新文件进行写入 |
| r+ | 以读写方式打开文件。文件的指针将会放在文件的开头。如果文件不存在,抛出异常 |
| w+ | 以读写方式打开文件。如果文件存在会被覆盖。如果文件不存在,创建新文件 |
| a+ | 以读写方式打开文件。如果该文件已存在,文件指针将会放在文件的结尾。如果文件不存在,创建新文件进行写入 |
提示
频繁移动文件指针会影响读写效率,开发中更多采用只读或只写模式操作文件。写入文件示例
# 打开文件
f = open("README", "w")
f.write("hello python!\n")
f.write("今天天气真好")
# 关闭文件
f.close()
(6) 按行读取文件内容
- read 方法默认将文件所有内容一次性读取至内存。
- 若文件过大,将对内存造成严重占用。
- readline 方法可一次读取一行内容。
- 该方法执行后,文件指针将移动至下一行,准备再次读取。
- 读取大文件的正确姿势
# 打开文件
file = open("README")
while True:
# 读取一行内容
text = file.readline()
# 判断是否读到内容
if not text:
break
# 每读取一行的末尾已经有了一个 `\n`
print(text, end="")
# 关闭文件
file.close()
(7) 文件读写案例 —— 复制文件
目标
通过代码实现文件复制过程。

小文件复制
打开已有文件,读取完整内容,并写入至另一个文件。
# 1. 打开文件
file_read = open("README")
file_write = open("README[复件]", "w")
# 2. 读取并写入文件
text = file_read.read()
file_write.write(text)
# 3. 关闭文件
file_read.close()
file_write.close()
大文件复制
打开已有文件,逐行读取内容,并顺序写入至另一个文件。
# 1. 打开文件
file_read = open("README")
file_write = open("README[复件]", "w")
# 2. 读取并写入文件
while True:
# 每次读取一行
text = file_read.readline()
# 判断是否读取到内容
if not text:
break
file_write.write(text)
# 3. 关闭文件
file_read.close()
file_write.close()
2、文件/目录的常用管理操作
- 在终端或文件浏览器中,可执行常规的文件/目录管理操作,例如:
- 创建、重命名、删除、改变路径、查看目录内容等。
- 在 Python 中,若希望通过程序实现上述功能,需导入 os 模块。
文件操作
| 序号 | 方法名 | 说明 | 示例 |
|---|---|---|---|
| 01 | rename | 重命名文件 os.rename(源文件名, 目标文件名) | |
| 02 | remove | 删除文件 os.remove(文件名) |
目录操作
| 序号 | 方法名 | 说明 | 示例 |
|---|---|---|---|
| 01 | listdir | 目录列表 | os.listdir(目录名) |
| 02 | mkdir | 创建目录 | os.mkdir(目录名) |
| 03 | rmdir | 删除目录 | os.rmdir(目录名) |
| 04 | getcwd | 获取当前目录 | os.getcwd() |
| 05 | chdir | 修改工作目录 | os.chdir(目标目录) |
| 06 | path.isdir | 判断是否是文件 | os.path.isdir(文件路径) |
提示:文件或者目录操作均支持相对路径和绝对路径。
3、Python 2.x 中如何使用中文
在 Python 2.x 文件的第一行添加以下代码,解释器将以 utf-8 编码处理 Python 文件。
# *-* coding:utf8 *-*
此为官方推荐的使用方式!
也可使用
# coding=utf8
unicode 字符串
- 在 Python 2.x 中,即使指定了文件使用 UTF-8 编码格式,遍历字符串时仍以字节为单位进行。
- 要正确遍历字符串,定义字符串时需在引号前增加小写字母 u,告知解释器这是一个 unicode 字符串(使用 UTF-8 编码格式)。
# *-* coding:utf8 *-*
# 在字符串前,增加一个 `u` 表示这个字符串是一个 utf8 字符串
hello_str = u"你好世界"
print(hello_str)
for c in hello_str:
print(c)
五、命名空间和作用域
变量是拥有匹配对象的名字(标识符)。命名空间是一个包含变量名称(键)及其对应对象(值)的字典。
Python 表达式可访问局部命名空间和全局命名空间中的变量。若局部变量与全局变量重名,局部变量将覆盖全局变量。
- 每个函数拥有独立的命名空间。类的方法作用域规则与常规函数相同。
- Python 会智能推断变量是局部还是全局,默认假设函数内赋值的变量为局部变量。
因此,若要在函数内给全局变量赋值,必须使用 global 语句。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
Money = 2000
def AddMoney():
# 想改正代码就取消以下注释:
# global Money
Money = Money + 1
print Money
AddMoney()
print Money
1、dir()函数
dir() 函数返回一个排序后的字符串列表,内容为模块中定义的名字。
返回的列表包含模块中定义的所有模块、变量和函数。如下为一个简单实例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 导入内置math模块
import math
content = dir(math)
print content;
以上实例输出结果:
['__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__ 指向该模块的导入文件名。
2、globals()和locals()函数
- 根据调用位置的不同,**globals()和locals()** 函数可用于返回全局和局部命名空间中的名字。
- 若在函数内部调用 locals(),返回的是该函数内可访问的所有命名。
- 若在函数内部调用 globals(),返回的是该函数内可访问的所有全局名字。
- 两个函数的返回类型均为字典,因此可用 keys() 函数提取名字。
3、reload()函数
当一个模块被导入脚本时,模块顶层代码仅执行一次。
因此,若想重新执行模块顶层代码,可使用 reload() 函数。该函数会重新导入之前已导入的模块。语法如下:
reload(module_name)
此处,module_name 需直接放置模块名,而非字符串形式。例如想重载 hello 模块,如下:
reload(hello)
到此这篇关于五分钟学会Python 模块和包、文件的文章就介绍到这了,更多相关Python 模块和包、文件内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













