是一个包含多个模块的特殊目录,使用 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("终端命令")

这就相当于输入直接控制了系统命令行,很危险。