Skip to content

文件操作与模块和包

文件操作与模块和包 ​

本篇要点:① 文件读写与备份 ② OS 模块(文件/目录操作) ③ time 模块 ④ 模块与包(导入、自定义、常见问题)


大纲 ​

  1. 文件操作(打开/关闭、读、写、备份案例、with)
  2. OS 模块(操作文件、操作目录)
  3. time 模块(时间戳、运行耗时)
  4. 模块和包(导入方式、random 模块、自定义模块与包)

一、文件操作 ​

文件的打开和关闭 ​

properties
open函数参数1 file: 文件路径
    绝对路径: 以盘符开头的路径
    相对路径: 不以盘符开头的路径  .当前目录  ..上一级目录
open函数参数2 mode: 文件模式
    r: 读(默认)    rb:二进制读    特点: 文件必须存在,否则报错
    w: 写         wb:二进制写    特点: 文件如果存在就使用,不存在就创建
    a: 追加       ab:二进制追加写 特点: 文件如果存在就使用,不存在就创建
open函数参数3 encoding: 文件编码
    注意: 二进制相关模式不需要文件编码,否则报错
    gbk: 主要针对中文扩展,又叫cp936
    utf8: 通用编码,又叫万国码
python
# 1.打开文件
f = open('word.txt', mode='r', encoding='utf8')
# 2.读写文件
# 3.关闭文件
f.close()

文件的读操作 ​

properties
读模式:
    r: 读非二进制格式数据
    rb: 读二进制格式数据
    字符串转二进制: 字符串.encode(编码)
    二进制转字符串: 二进制.decode(编码)

一个个读:
    read(num): 读n个字符
    read(): 读剩下的所有字符
一行行读:
    readline(): 读一行
    readlines(): 读剩下的所有行(默认放到列表中返回)
python
# 注意: 如果读取非文本文件,则需要指定mode='rb',且不能添加encoding参数
f = open('word.txt', 'r', encoding='utf8')
# 方式1: read(num) 读取指定num个字符
# content = f.read(7)
# 方式2: read() 默认读取所有字符
content = f.read()
print(content)
# 方式3: readline() 读取一行
# 方式4: readlines() 一次性读取所有行
f.close()

文件的写操作 ​

properties
写模式:
    w: 非二进制格式数据,覆盖写
    a: 非二进制格式数据,追加写
    ab: 二进制格式数据,追加写

一个个写: write(内容)
一行行写: writelines(内容)
python
f = open('new_word.txt', 'w', encoding='utf8')
f.write('hello world\n')
f.writelines(['你好\n', 'python\n', '文件操作\n'])
f.close()

文件的备份综合案例 ​

文本文件/任意文件的备份 ​

python
# 分析: 要完成任意文件,读写模式都应该选择通用的二进制模式
f_in = open('sources/file.mp4', 'rb')
f_out = open('backup/file[备份].mp4', 'wb')
# 先读取源文件
data = f_in.read()
# 再把源文件数据写入到备份文件
f_out.write(data)
# 关闭文件: 先开后关
f_out.close()
f_in.close()

函数优化版 ​

python
def file_copy(in_path):
    i = in_path.rfind('.')
    if i == -1:
        print('对不起,您输入的文件路径无效!!!')
    else:
        out_path = in_path[:i] + "[备份]" + in_path[i:]
        f1 = open(in_path, 'rb')
        f2 = open(out_path, 'wb')
        data = f1.read()
        f2.write(data)
        f2.close()
        f1.close()

in_path = input('请您输入要备份的文件路径:')
file_copy(in_path)

补充:with open 方式 ​

python
# f = open(): 必须手动关闭文件,也可能受异常影响导致没有执行到关闭代码
# with open() as f: 自动关闭文件,不会受异常影响
with open('sources/word.txt', 'r', encoding='utf8') as f_in:
    data = f_in.read()
    print(data)

二、OS 模块 ​

简介 ​

os 模块是 Python 标准库的一部分,提供了丰富的功能与操作系统进行交互,如文件重命名、文件删除、获取当前工作目录、创建和删除目录、检查文件或目录是否存在等。

python
import os
# 获取环境变量(先系统变量然后用户变量)
print(os.getenv("PATH"))
# 由于api很多不要试图去记忆,学会os.查找函数

操作文件 ​

编号函数功能
1os.rename(目标文件名,新文件名)对文件进行重命名操作
2os.remove(要删除文件名)对文件进行删除操作
python
import os
# 注意: 要修改或者删除的文件一定要存在
os.rename('sources/new_word.txt', 'sources/new_word_rename.txt')
os.remove('sources/new_word_rename.txt')

操作目录 ​

编号函数功能
1os.mkdir(新文件夹名称)创建指定名称的文件夹
2os.getcwd()获取当前目录名称
3os.chdir(切换后目录名称)切换目录
4os.listdir(目标目录)获取指定目录下的文件信息,返回列表
5os.rmdir(目标目录)删除指定名称的"空"文件夹
python
import os
# 获取当前工作目录
print(os.getcwd())
# 切换工作目录
os.chdir('static')
print(os.getcwd())
# 创建目录
os.mkdir('images')
os.mkdir('videos')
# 获取目录下所有文件和文件夹
print(os.listdir())
# 移除文件夹(rmdir只能删除空目录)
os.rmdir('videos')
# 删除非空目录可以用 shutil.rmtree()
import shutil
shutil.rmtree('static')

补充:os 模块完整 API 参考 ​

1. 目录操作 ​

函数说明
os.getcwd()返回当前工作目录的字符串
os.chdir(path)将当前工作目录更改为 path
os.listdir(path='.')返回指定目录下所有文件和目录名的列表
os.mkdir(path, mode=0o777)创建单层目录,已存在则抛 FileExistsError
os.makedirs(path, exist_ok=False)递归创建多层目录,exist_ok=True 时不报错
os.rmdir(path)删除空目录
os.removedirs(path)递归删除空目录,直到遇到非空目录
os.rename(src, dst)重命名文件或目录(也可移动文件)
os.stat(path)获取文件/目录状态信息(大小、修改时间等)

2. 文件操作 ​

函数说明
os.remove(path)删除文件
os.unlink(path)同 os.remove()
os.replace(src, dst)重命名,目标存在则覆盖(跨平台)
os.path.getsize(path)获取文件大小(字节)
os.path.getmtime(path)获取最后修改时间(时间戳)

3. 路径操作(os.path 模块) ​

函数说明
os.path.join(a, *p)智能拼接路径,自动使用当前系统分隔符
os.path.exists(path)判断路径是否存在
os.path.isfile(path)判断路径是否为文件
os.path.isdir(path)判断路径是否为目录
os.path.abspath(path)返回绝对路径
os.path.basename(path)返回路径中的文件名部分
os.path.dirname(path)返回路径中的目录部分
os.path.split(path)拆分路径为 (目录, 文件名) 元组
os.path.splitext(path)拆分路径为 (根, 扩展名) 元组

4. 遍历目录树(os.walk) ​

os.walk(top) 生成目录树中所有文件路径,返回三元组 (dirpath, dirnames, filenames),用于递归遍历。

python
import os

for root, dirs, files in os.walk('.'):
    for file in files:
        print(os.path.join(root, file))

5. 其他常用 ​

函数说明
os.environ访问环境变量的字典
os.sep当前系统的路径分隔符(\ 或 /)
os.linesep当前系统的换行符
os.system(command)执行操作系统命令(不推荐,建议用 subprocess)

6. 综合演示 ​

python
import os

cwd = os.getcwd()
print("当前目录:", cwd)

os.makedirs("test_dir/sub_dir", exist_ok=True)   # 创建目录
os.chdir("test_dir")
print("切换后目录:", os.getcwd())

with open("example.txt", "w") as f:              # 创建文件并写入
    f.write("Hello, World!")

print("目录内容:", os.listdir())
if os.path.exists("example.txt"):                # 检查文件是否存在
    print("文件大小:", os.path.getsize("example.txt"), "字节")

os.rename("example.txt", "new_example.txt")      # 重命名
os.remove("new_example.txt")                     # 删除文件

os.chdir("..")
os.removedirs("test_dir/sub_dir")                # 删除目录树(需先清空内容)

注意事项 ​

  • 使用 os.remove() 和 os.rmdir() 时要确保文件/目录存在且权限正确。
  • 操作路径时推荐使用 os.path.join() 避免跨平台问题。
  • 更高级的文件操作(复制、移动、删除非空目录)建议使用 shutil 模块。

三、time 模块 ​

入门案例 ​

python
import time
import datetime

# 获取当前时间戳: 1970年1月1日0时0分0秒到当前时间的秒数
print(time.time())   # 重点!!!
print(time.localtime())
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
# datetime 方式
print(datetime.datetime.now())
print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))

计算程序运行时间 ​

python
import time

start = time.time()
print("开始时间:", start)
# 累加计算1到1亿的数字之和
sum = 0
for i in range(1, 100000001):
    sum += i
print(f"总和:{sum}")
end = time.time()
print("程序运行时间:", end - start)

四、模块和包 ​

模块概念 ​

Python 模块(Module)是一个 Python 文件,以 .py 结尾。模块能定义函数、类和变量,模块里也能包含可执行的代码。 模块的作用:python 中有很多不同的模块,每个模块都可以帮助我们快速实现一些功能(如 time 模块实现时间相关功能)。可以认为一个模块就是一个工具包。

导入模块 ​

properties
import方式
    import 包名.模块名 [as 别名]
    import 模块名 [as 别名]

from方式
    from 包名 import 模块名 [as 别名]
    from 模块名 import 功能名 [as 别名]
    from 包名.模块名 import 功能名 [as 别名]
python
# import方式导入模块
import random
print(random.randint(1, 5))

# from方式导入模块中指定功能
from random import randint
print(randint(1, 5))

# from方式导入模块中所有功能
from random import *
print(choice('abc_123'))
print(sample('abc_123', 2))

# import起别名方式
import random as r
print(r.randint(1, 5))

# from起别名方式
from random import randint as rint
print(rint(1, 5))

体验 random 模块 ​

random 模块:python 一个具有多种随机功能的内置 python 文件。 使用步骤:1.导包 import random 2.调用 random.函数名(参数)

python
# 需求: 随机生成验证码
import random

s = '1234567890_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
# 方式1: 用sample取4个字符
l1 = random.sample(s, 4)
yzm1 = ''.join(l1)
print(yzm1)
# 方式2: 随机4次,用choice每次取一个字符,然后拼接
yzm2 = ''
for i in range(4):
    yzm2 += random.choice(s)
print(yzm2)
# 方式3: 随机4次,用randint每次取一个索引,然后通过索引取字符
yzm3 = ''
for i in range(4):
    index = random.randint(0, len(s) - 1)
    yzm3 += s[index]
print(yzm3)

拓展:string / math 模块 ​

python
# string模块: 快速生成字母数字下划线组成的字符串
import string
zm = string.ascii_letters
sz = string.digits
s = zm + sz + '_'

# math模块
import math
print(math.pi)       # 圆周率
print(math.sqrt(9))  # 开方
print(math.pow(2, 3))  # 幂
print(math.log10(100)) # 对数

自定义模块和包 ​

properties
包: 本质就是目录,但此目录中必须有一个__init__.py文件管理模块
模块: 本质就是一个py文件,但文件名必须符合标识符命名规则
模块名命名规则: 由字母,数字,下划线组成,不能以数字开头,不能是关键字,严格区分大小写

自定义模块(my_m1) ​

python
def add(a, b):
    print('my_m1中add函数被调用了...')
    print(a + b)

# 测试的时候没有注释,别人导包的时候就会执行,如何解决?
# 解决方案: 添加main判断
# 当前文件运行__name__值是__main__,其他文件运行__name__值是模块名
if __name__ == '__main__':
    add(1, 2)

all 列表(my_m3) ​

python
# 注意: 如果没有__all__列表,from my_m3 import * 默认导入所有功能
# 设置__all__列表,指定哪些功能可以被 from my_m3 import * 导入
__all__ = ['show1', 'show2', 'show3']

def show1():
    print('my_m3中show1函数被调用了...')
def show4():
    print('my_m3中show4函数被调用了...')  # 不在__all__中,不会被导入

自定义包 ​

自定义包结构

python
# 包的__init__.py文件
# 如果__init__.py中没有__all__列表,from 包 import * 方式不生效
__all__ = ['my_m4', 'my_m5']   # 只能导入__all__列表中的模块

常见问题 ​

导入模块中功能 ​

python
# 问题1: 如果my_m1中调用函数时没有添加main判断,导包的时候就会自动调用执行
import my_m1
my_m1.add(3, 4)

# 问题2: 如果用from方式从多个模块导入同名功能,默认就近原则用最后导入的功能
from my_m1 import add
from my_m2 import add
add(3, 4)   # 使用的是my_m2的add

# 问题3: 如果模块中设置了__all__列表,则from方式只能导入此列表中指定功能
from my_m3 import *
show1()
show2()
show3()
# show4() # 报错,因为__all__列表没有指定

导入包中模块功能 ​

python
# from 包名 import 模块名
from my_package import my_m4
my_m4.test()

# import 包名.模块名
import my_package.my_m4
my_package.my_m4.test()

# from 包 import * : 必须配合__init__.py中的__all__列表使用
from my_package import *
my_m4.test()
my_m5.test()
# my_m6.test() # 报错,因为__all__列表没有指定my_m6模块

基于 VitePress 构建 · 专注前端与 AI 实战