栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

自学Python第九天- 模块、包、编码、文件操作、OS 模块、打包

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

自学Python第九天- 模块、包、编码、文件操作、OS 模块、打包

自学Python第九天- 模块、包、编码、文件操作、OS 模块、打包
  • 模块
    • 导入模块
    • 程序入口
  • 包
  • 编码
  • 文件操作
    • 打开或创建文件
    • 常用的文件打开模式
    • 边读边写
    • 文件对象的常用方法
    • 读写 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 泛指符合以下特征的任何文件:

  • 纯文本,使用某个文本字符集,由记录组成
  • 每条记录被分隔符分隔为字段(典型的分隔符有逗号,分号,制表符或可选的空格)
  • 每条记录都有同样的字段序列

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 下的所有子目录,返回所有的子目录和文件信息
os.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 项目文件

当一个项目中使用了多个 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 文件即可。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/958499.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号