包
包 是一个包含多个模块的特殊目录,使用 import 包名
可以一次性导入包中的 所有模块,简化程序。
包目录下有一个特殊的文件 __init__.py
,需要在该文件中中指定对外界提供的模块列表。
test.py
:
import pack1
pack1.send_message.send("hello")
text = pack1.receive.message.receive()
print(text)
发布模块
可以将自己开发的模块打包分享给其他人。
制作压缩包
首先在模块同目录下创建一个 setup.py
文件,内容如下(参阅 https://docs.python.org/3/distutils/apiref.html ):
from distutils.core import setup
setup(name="pack1", # 包名
version="1.0", # 版本
description="发送和接收消息模块", # 描述信息
long_description="完整的发送和接收消息模块", # 完整描述信息
author="X", # 作者
author_email="xxx@xx.com", # 作者邮箱
url="www.tangjiayan.com", # 主页
py_modules=["pack1.send_message",
"pack1.receive_message"])
构建模块
$ python setup.py build
生成发布压缩包
$ python setup.py sdist
执行完这步就会生成 .tar.gz
文件,就可以分享给别人用了。
安装 / 卸载模块
安装模块:
$ tar -zxvf pack1.tar.gz
$ sudo python setup.py install
卸载模块:
直接从安装目录下,把安装模块的 目录 删除就可以
$ sudo rm -r pack1*
使用 pip
安装第三方模块
第三方模块 通常是由知名的第三方团队开发的、被广泛使用的 Python
包 / 模块
,例如 pygame
是一套成熟的游戏开发模块。
pip
是一个现代的,通用的 Python
包管理工具,提供了对 Python
包的查找、下载、安装、卸载等功能。
$ sudo pip install pygame
$ sudo pip uninstall pygame
再如,在 Linux
下安装 iPython
:
$ sudo apt install ipython
$ sudo apt install ipython3
使用 PyCharm 也可以直接安装第三方模块:
文件
文本文件和二进制文件
文本文件:使用 文本编辑软件 查看,本质上还是二进制文件。
二进制文件:不是直接阅读的,不能使用文本编辑软件查看,而是提供给其他软件使用的,如图片文件、音频文件、视频文件等。
文件操作
open
:打开文件,并且返回文件操作对象read
:将文件内容读取到内存write
:将指定内容写入文件close
:关闭文件- 如果忘记关闭文件,会造成系统资源消耗,并且影响到后续对文件的访问
在开发中,通常会先编写 打开 和 关闭 的代码,再编写中间针对文件的 读 / 写 操作,以防止不小心忘记文件关闭指令。
file = open("README")
text = file.read()
print(text)
file.close()
文件指针
文件指针 标记从哪个位置开始读取数据。
第一次打开** 文件时,通常文件指针会指向文件的开始位置,当执行了 read
方法后,文件指针 会移动到 读取内容的末尾,默认情况下会移动到 文件末尾。
所以执行了一次 read
方法后,再次调用 read
方法,就获取不到内容了,因为文件指针已经移动到了文件末尾。
文件读写详解
open
函数默认以 只读方式 打开文件。
file = open("文件名", "访问方式")
r
:以 只读 方式打开文件,文件的指针会放在文件的开头。w
:以 只写 方式打开文件。- 如果文件存在,执行完
write
命令后会覆盖原文件。 - 如果文件不存在,则创建新文件。
- 如果文件存在,执行完
a
:以 追加 (append)方式打开文件。- 如果该文件已存在,文件指针会放在文件的结尾。
- 如果文件不存在,创建新文件进行写入。
r+
:以读写方式打开文件,文件的指针会放在文件的开头。w+
:以读写方式打开文件。- 如果文件存在,执行完
write
命令后会覆盖原文件。 - 如果文件不存在,创建新文件。
- 如果文件存在,执行完
a+
:以读写方式打开文件。- 如果该文件已存在,文件指针会放在文件的结尾。
- 如果文件不存在,创建新文件进行写入。
频繁地移动文件指针会影响文件的读写效率,所以开发中更多的时候会以 只读、只写 的方式来操作文件,而不是读写方式。
f = open("README", "w")
f.write("hello python!\n")
f.write("今天天气真好")
f.close()
按行读取文件内容
read
方法默认会把文件的 所有内容 一次性读取到内存,如果文件太大,对内存的占用会非常严重。
readline
方法可以一次读取一行内容,方法执行后,会把 文件指针 移动到下一行,准备再次读取。
file = open("README")
while True:
text = file.readline()
if not text:
break
print(text, end="")
file.close()
案例:使用读写来复制文件
小文件:
file_read = open("README")
file_write = open("README[复件]", "w")
text = file_read.read()
file_write.write(text)
file_read.close()
file_write.close()
大文件:
file_read = open("README")
file_write = open("README[复件]", "w")
while True:
text = file_read.readline()
if not text:
break
file_write.write(text)
file_read.close()
file_write.close()
文件/目录的常用管理操作
首先需要导入 os
模块。以下函数都是在 os
模块下调用的,即 os.函数名
。
rename
:重命名文件remove
:删除文件listdir
:目录列表mkdir
:创建目录rmdir
:删除目录getcwd
:获取当前目录chdir
:修改工作目录path.isdir
:判断是否是文件
eval 函数
eval()
函数可以将字符串当成有效的表达式来求值,返回计算结果。
# 基本的数学计算
In [1]: eval("1 + 1")
Out[1]: 2
# 字符串重复
In [2]: eval("'*' * 10")
Out[2]: '**********'
# 将字符串转换成列表
In [3]: type(eval("[1, 2, 3, 4, 5]"))
Out[3]: list
# 将字符串转换成字典
In [4]: type(eval("{'name': 'xiaoming', 'age': 18}"))
Out[4]: dict
例:计算器
input_str = input("请输入一个算术题:")
print(eval(input_str))
不要滥用 eval
函数,程序中千万不要出现用 eval
直接转换 input
的结果,很容易被注入攻击:
等价于:
import os
os.system("终端命令")
这就相当于输入直接控制了系统命令行,很危险。