- 模块
- 导入模块
- 程序入口
- 包
- 编码
- 文件操作
- 打开或创建文件
- 常用的文件打开模式
- 边读边写
- 文件对象的常用方法
- 读写 CSV
- 上下文管理器 with
- OS 模块
- os 操作目录的相关函数
- os.path 操作目录相关函数
- 打包
- 打包单个 py 项目文件
- 打包多个 py 项目文件
python 中的模块就是一个包含 python 执行代码的文件,通常以 .py 为后缀结束。python 的程序入口(也叫项目的主程序)也是 .py 文件,可以视为一个特殊的模块。使用模块可以避免函数名和变量名冲突,提高了代码的维护性和重用性。
导入模块模块需要经过导入使用。python 使用 import 导入模块,也可以使用 from 和 import 导入模块中的具体函数、变量或类。如果使用 import 导入的模块需要指定模块名称,而使用 from import 则可以直接使用。可以使用 from 模块名 import * 的方法导入,只是需要注意名称别有重复项。
# module_1.py
def test_1():
print('这是函数 test_1')
def test_2():
print('这是函数 test_2')
# main.py from module_1 import test_1 test_1() # 执行结果: 这是函数 test_1 test_2() # 会报错,函数 test_2 未定义
# main_2.py import module_1 module_1.test_1() # 执行结果: 这是函数 test_1 module_1.test_2() # 执行结果: 这是函数 test_2
from module_1 import * test_1() # 执行结果: 这是函数 test_1 test_2() # 执行结果: 这是函数 test_2程序入口
通过直接运行和作为模块导入方式使用 .py 文件的代码,两种方式是有区别的:
- 直接运行:按照规则顺序执行代码
- 导入使用:当导入时会立刻加载并执行程序主入口外的代码。
使用 if __name__ = '__main__' : 来定义程序的入口。如果是直接运行的话,则可以当成项目主程序,来执行入口内部的代码。如果是以导入方式运行,则不执行程序入口内部的代码。
# demo1
def func_1():
print('func_1')
def func_2():
print('func_2')
func_1()
# 程序的主入口
if __name__ == '__main__': # 表示程序主入口
func_2()
# demo2 import demo1
当运行 demo1 时,查看输出结果可以发现,顺序执行了 func_1、func_2 函数。而当运行 demo2 时,查看输出结果可以发现,执行了 func_1 函数,func_2 函数并没有执行。基于这个机制,可以在作为模块被导入的文件中,不想立刻被执行的代码和调用写在主程序中。
另外,查看本文件的 name 可以看到输出值是 main ,而使用导入查看 name ,则输出的是文件或模块名。
# demo1 print(__name__) # 以当前程序执行,输出 '__main__' if __name__ == '__main__': pass
# demo2 import demo1 # 输出结果 demo1
程序入口通常用来隐藏部分不执行的代码,例如在模块中定义的函数、类或方法后的测试代码,可以放在程序入口内部。这样导入模块时并不运行,而测试调试模块时可以执行。
包python 中的包是一个分层次的目录结构,将一组功能相近的模块组织在一个目录下。包和目录的区别在于,包内含有 __init__.py 文件。包可以使用 import 包名.模块名 来导入。导入的包和模块可以起别名,来方便使用。例如:
import package_1.module_A.class_a as pmc1 print(pmc1.name) print(package_1.modele_A.class_a.name) # 两者等价
如果需要导入整个包,则在定义包时需要在 __init__.py 中指定能够提供的模块列表
# __init__.py from . import 模块名
需注意的是,使用 import 方式导入时,只能跟包名或模块名。使用 from import 时可以具体到变量,但是需要注意名称重复的问题。
编码python 的解释器使用的是内存中的数据,其编码格式为 Unicode 。而 .py 文件是放在硬盘上的代码文件,使用 UTF-8 编码进行存储。由于 Unicode 和 UTF-8 编码互不兼容,所以在使用时需要进行编码和解码。
文件操作python 的解释器通过 IO 操作硬盘上的文件(打开或新建),然后对文件的二进制内容进行读、写操作,在操作完成后关闭文件。
打开或创建文件open(filename[,mode,encoding]) 返回创建或打开的文件对象。filename 是文件名,mode 是打开方式 ,encoding 是编码格式,默认为 gbk。文件类型分为文本文件和二进制文件。
file = open('a.txt','r')
print(file.readlines())
file.close()
常用的文件打开模式
参数 mode 的常用内容:
- r :以只读模式打开文件。指针在文件开始
- w :以只写模式打开文件,如文件不存在则创建,如存在则覆写。指针在文件开头
- a :以追加模式打开文件,如文件不存在则创建,如存在则在末尾追加内容。指针在原文件末尾
- b :以二进制方式打开文件,不能单独使用,需与其他模式一起使用,如 rb 或 wb 等
- + :以读写模式打开文件,不能单独使用,需与其他模式一起使用,如 a+ 等
file = open('b.txt','w')
file.write('你好,中国!')
file.close()
写入可以使用 file.write() 也可以使用 print() 函数进行写入
file = open('b.txt','w')
print('你好,中国!', file=file)
file.close()
需注意的是,写入文件字符串时(即使用 file.write())如果文件打开方式是 wb 即以二进制写入方式,则写入的字符串必须是 b’str’ 即二进制字符串的格式。
边读边写使用两个不同的文件对象就可以进行边读边写,也可以通过这个方式进行复制。
srcFile = open('slide01.jpg', 'rb') # 源文件,读取二进制文件
targetFile = open('copySlide01.jpg', 'wb') # 目标文件,写入二进制文件
targetFile.write(srcFile.read()) # 写入读取的内容,边读边写
targetFile.close()
srcFile.close()
文件对象的常用方法
文件对象有以下的常用方法
- read([size]) :从文件中读取 size 个字节或字符的内容并返回。若省略参数则读取所有内容。
- readline() :从文本文件中读取一行内容。
- readlines() :把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回。
- write(str) :将字符串 str 内容写入文件,也可以写入二进制流。
- writelines(s_list) :将字符串列表 s_list 写入文本文件,不添加换行符。
- seek(offset[,whence]) :把文件指针移动到新的位置,offset 表示相对于 whence 的位置。 offset 为正则往后移动,为负往前移动。whence 为0表示从头开始计算(默认值),为1表示从当前位置开始计算,为2表示从文件尾开始计算。
- tell() :返回文件指针的当前位置。
- flush() :把缓冲区的内容写入文件,但不关闭文件。
- close() :把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源。
CSV 是一类通用的、相对简单的文件格式,其并不是一种单一的、定义明确的格式。在实践中, CSV 泛指符合以下特征的任何文件:
- 纯文本,使用某个文本字符集,由记录组成
- 每条记录被分隔符分隔为字段(典型的分隔符有逗号,分号,制表符或可选的空格)
- 每条记录都有同样的字段序列
CSV 常用于在不同格式间传递表格。在 python 中可以使用 csv 模块来读取 csv 文件:
import csv
with open('test.csv','r') as csvfile:
# 读取 csv 文件,返回的是迭代类型
read = csv.reader(csvfile)
for i in read:
print(i)
# 或读取指定行的内容
# data = list(read)
# print(data[2])
上下文管理器 with
with 语句可以自动管理上下文资源,不论什么原因跳出 with 块,都能确保文件正确的关闭,以此来达到释放资源的目的。
with open('a.txt', 'r') as file: # 相当于 file = open('a.txt', 'r') , 并声明使用with进行上下文管理
print(file.read()) # 当结束 with 的语句体,则释放资源
哪些对象能使用 with 进行管理呢?或者自定义的对象能否使用 with ?
其实使用 with 时,with 跟随的代码是上下文表达式,运行时创建一个上下文管理器对象并自动调用 __enter__() 方法,将返回值赋值给 as 后跟随的变量。当 with 代码块结束后,则调用 __exit__() 方法,且不管 with 代码块是否正常结束(如果有错误抛出,则为非正常结束,例如执行了 1/0 (0不能当除数))。
# 遵守了上下文管理器协议,该类对象的实例对象称为上下文管理器
class MyContentMgr():
def __enter__(self):
print('enter方法被调用了')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('exit 方法被调用了')
def show(self):
print('show 方法被调用了')
with MyContentMgr() as test:
test.show()
with 语句也可以进行嵌套使用,对多个对象进行上下文管理。
OS 模块os 模块是 python 内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样。os 模块与 os.path 模块用于对目录或文件进行操作。
import os
os.system('notepad.exe') # 和在运行里输入 notepad.exe 效果等同
os.system('calc.exe')
os.startfile('D:\Program Files\FSCapture97\FSCapture.exe') # 执行路径指定的可执行文件
os 操作目录的相关函数
- getcwd() :返回当前的工作目录
- listdir(path) :返回指定路径下的文件和目录信息
- mkdir(path[,mode]) :创建目录(Dos 命令里的 md)
- makedirs(path1/path2...[,mode]) :创建多级目录
- rmdir(paht) :删除目录(Dos 命令里的 rd)
- removedirs(paht1/path2......) :删除多级目录
- chdir(paht) :将 path 设为当前工作目录(Dos 命令里的 cd)
- walk(path) :递归遍历 path 下的所有子目录,返回所有的子目录和文件信息
- abspath(path) :用于获取文件或目录的绝对路径
- exists(path) :用于判断文件或目录是否存在,返回 bool 值
- join(path,name) :将目录与目录或文件名拼接起来
- splitext() :分离文件名和扩展名
- split() :分离路径和文件名
- basename(path) :从一个目录中提取文件名
- dirname(paht) :从一个路径中提取文件路径,不包括文件名
- isdir(paht) :用于判断是否为路径
项目完成后,执行方式有2种:
- 使用解释器执行项目代码
- 进行打包,将项目文件、所涉及的库和解释器打包成为可执行文件运行
第一种方法最简单,使用解释器调用项目的主文件即可,这里主要研究第二种方法。
python 打包需要用的 PyInstaller 库,所以首先需要使用 pip 进行安装
pip install PyInstaller
然后就可以打包了。
打包单个 py 项目文件直接使用 PyInstaller 打包单个项目文件。
pyinstall -F PATH
参数 -F 指的是打包成一个 exe 文件,PyInstaller 具体可用的参数有:
- -h :说明文档
- -F :打包成一个 exe 文件。执行时会将整个 exe 加载进内存。所以启动速度慢,执行速度快,对于小项目可以使用。
- -D :打包成一个文件夹。将所有需要引用的库打包成 dll 文件,包括其他资源文件放在文件夹下,在需要调用时再加载。所以加启动度快,执行速度慢,适合比较大的项目。
- -w :不显示控制台。如果不加这个参数,运行时会显示命令行窗口(仅对 windows 有效)
- -c :指定使用控制台。强制显示命令行窗口(仅对 windows 有效)
- -p DIR :指定 Python 导入模块的路径(和设置 pythonPath 环境变量作用相似)
- -o DIR :指定生成项目文件的路径
- -i icon py :将 py 路径的项目文件打包,并使用 icon 路径的图标文件作为可执行文件图标
当一个项目中使用了多个 py 项目文件时,则需要先生成 spec 文件来打包。使用 pyi-makespec 来生成 spec 文件。
pyi-makespec PYFile.py
其中 PYFile.py 是程序入口 py 文件。完成之后回来当前目录下生成一个同名的 .spec 文件,可以在 pycharm 里打开。这个文件里其他的不用管,找到 a = Analysis() 的内容,会发现里面有个列表,列表里有个元素是字符串 ‘GUI.py’ 。在这个列表中将项目中的其他 py 文件都加进去,如果不同目录需要输入绝对地址。如果调用了图片、dll 等二进制文件,需要添加到 spec 文件的 datas 这个列表中(使用相对路径的话打包完了需要复制到生成的 exe 文件相对路径下)。
a = Analysis(['GUI.py', 'PYFile.py', 'test1.py', 'E:\a\module_1.py'], . . . . )
需注意的是,绝对路径中要使用双斜杠 。修改完成后保存,然后使用 pyinstaller 像单独文件打包时一样打包这个 .spec 文件即可。



