一. os模块和os.path模块
1.1 os模块介绍
OS:Operating System 操作系统
- 1、os模块是python内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样。
- 2、os模块与os.path模块用于对目录或文件进行操作
例:打开记事本
执行代码就自动打开
# 打开记事本 import os os.system('notepad.exe')
和Win+R再输入notepad再回车,结果一样
例:打开计算器
# 打开计算器 import os os.system('calc.exe')
例:启动QQ
# 直接调用可执行文件 # 启动QQ import os os.startfile('D:\\Program Files\\Tencent\\QQ\\Bin\\qq.exe')
1.2 os模块操作目录相关函数
函数名 | 使用方法 |
getcwd() | 返回当前工作目录 |
listdir(path) | 返回指定路径下的文件和目录信息 |
mkdir(path[,mode]) | 创建单层目录,如该目录已存在抛出异常 |
makedirs(path) | 递归创建多层目录,如该目录已存在抛出异常,注意:'E:\a\b’和’E:\a\c’并不会冲突 |
rmdir(path) | 删除单层目录,如该目录非空则抛出异常 |
removedirs(path1/path2…) | 递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则抛出异常 |
chdir(path) | 将path设置为当前工作目录 |
remove(path) | 删除文件 |
rename(old, new) | 将文件old重命名为new |
system(command) | 运行系统的shell命令 |
walk(top) | 遍历top路径以下所有的子目录,返回一个三元组:(路径, [包含目录], [包含文件]) |
以下是支持路径操作中常用到的一些定义,支持所有平台 |
os.curdir | 指代当前目录(‘.’) |
os.pardir | 指代上一级目录(‘…’) |
os.sep | 输出操作系统特定的路径分隔符(Win下为’\‘,Linux下为’/') |
os.linesep | 当前平台使用的行终止符(Win下为’\r\n’,Linux下为’\n’ |
os.name | 指代当前使用的操作系统(包括:‘posix’, ‘nt’, ‘mac’, ‘os2’, ‘ce’, ‘java’) |
os.getcwd():获取当前工作目录
import os print(os.getcwd())
C:\Users\zdb\PycharmProjects\untitled
os.chdir() :设置设置当前工作目录
os.listdir(): 列举指定目录中的文件名
(’.‘表示当前目录,’…'表示上一级目录)
import os print(os.getcwd()) #获取当前工作目录 os.chdir('E:\\') #改变工作目录 print(os.getcwd()) print(os.listdir('E:\\')) #把目录中的所有文件列举出来
C:\Users\zdb\PycharmProjects\untitled E:\ ['$RECYCLE.BIN', 'abc.txt', 'BaiduNetdiskDownload', 'DTLFolder', 'QLDownload', 'qqpcmgr_docpro', 'qycache', 'shuzizhong', 'System Volume Information', 'text.txt', 'WanyxGames', 'work', 'Youku Files', '江西理工大学-Ver6.0.0(20170419)Windows(通用版).exe']
mkdir(path) :创建单层目录,如该目录已存在抛出异常
os.mkdir('E:\\A') #E潘中创建文件夹A os.mkdir('E:\\A\\B') #A里面建立B
makedirs(path):创建多级目录
### makedirs(path) 创建多级目录
remove(path) :删除文件
os.remove('E:\\A\\B\\text.txt') #删除text.txt
rmdir(path):删除单层目录,如该目录非空则抛出异常
os.rmdir('E:\\A\\B') #删除B
rmmovedirs(path):删除多级目录
import os os.removedirs('A/B/C')
os.curdir 指代当前目录(’.’)
import os print(os.curdir) #显示当前目录 print(os.listdir(os.curdir)) #显示上一级目录
. ['.idea', 'A_1.txt', 'A_2.txt', 'A_3.txt', 'B_1.txt', 'B_2.txt', 'B_3.txt', 'temp.py', 'venv']
1.3 os.path模块操作目录相关函数
函数名 | 使用方法 |
abspath(path) | 用于获取文件或目录的绝对路径 |
exists(path) | 判断指定路径(目录或文件)是否存在,存在返回True |
join(path, name) | 将目录与目录或者文件名拼接起来 |
splitext(path) | 分离文件名与扩展名,返回(f_name, f_extension)元组 |
basename(path) | 从一个目录中提取文件名 |
dirname(path) | 从一个路径中提取文件路径,不包括文件名 |
isdir(path) | 同于判断是否为路径 |
split(path) | 分割文件名与路径,返回(f_path, f_name)元组。如果完全使用目录,它也会将最后一个目录作为文件名分离,且不会判断文件或者目录是否存在 |
getsize(file) | 返回指定文件的尺寸,单位是字节 |
getatime(file) | 返回指定文件最近的访问时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算) |
getctime(file) | 返回指定文件的创建时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算) |
getmtime(file) | 返回指定文件最新的修改时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算) |
以下为函数返回 True 或 False |
|
isabs(path) | 判断指定路径是否为绝对路径 |
isfile(path) | 判断指定路径是否存在且是一个文件 |
islink(path) | 判断指定路径是否存在且是一个符号链接 |
ismount(path) | 判断指定路径是否存在且是一个挂载点 |
samefile(path1, paht2) | 判断path1和path2两个路径是否指向同一个文件 |
os.path.relpath(patj, start):返回从start到path的相对路径的字符串
os.path.abspath():返回文件的绝对路径
import os.path print(os.path.abspath('temp.py'))
C:\Users\zdb\PycharmProjects\untitled\temp.py
os.path.exists(path):判断文件是否存在
# 判断文件是否存在,存在为True import os.path print(os.path.exists('temp.py'), os.path.exists('111.py'))
True False
os.path.join() :合成路径
import os.path print(os.path.join('E:\\Python', 'temp.py'))
E:\Python\temp.py
例2
import os print(os.path.join('A','B','C')) #合成工作路径名 print(os.path.join('C:','A','B','C')) print(os.path.join('C:\\','A','B','C'))
A\B\C C:A\B\C C:\A\B\C
basename(path) :去掉目录路径,单独返回文件名
import os print(os.path.basename('E:\\A\\B\\C\\abc.avi')) #只显示文件名
abc.avi
dirname(path) :去掉文件名,单独返回目录路径
import os print(os.path.dirname('E:\\A\\B\\C\\abc.avi')) #只显示工作路径
E:\A\B\C
os.path.split(path) :分割文件名与路径,返回(f_path, f_name)元组。如果完全使用目录,它也会将最后一个目录作为文件名分离,且不会判断文件或者目录是否存在
import os print(os.path.split('E\\A\\abc.avi')) #分割文件名与路径 print(os.path.split('E\\A\\B')) #将最后一个目录作为文件名分割下来
('E\\A', 'abc.avi') ('E\\A', 'B')
splitext(path) :分离文件名与扩展名,返回(f_name, f_extension)元组
import os print(os.path.splitext('E\\A\\abc.avi')) #分离文件名与文件后缀
('E\\A\\abc', '.avi')
ismount(path) :判断指定路径是否存在且是一个挂载点
import os print(os.path.ismount('E:\\')) print(os.path.ismount('E:\\A'))
True False
课堂案例
例:获取当前目录里的所有.py文件
import os path = os.getcwd() # 获取当前工作目录 lst = os.listdir(path) # 列举当前目录的所有文件,放在列表中 for filename in lst: # 遍历列表中的所有文件 if filename.endswith('.py'): # 如果是.py文件 print(filename) # 就输出
alien_invasion.py all_events.py ball.py car.py electric_car.py game_functions.py glass.py main.py name_function.py pizza.py settings.py survey.py temp.py
1.4 os.path.getatime() 、os.path.getctime()、os.path.getmtime()
os.path.getatime(file) :访问时间
- 返回指定文件最近的访问时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算)
oa.path.getctime(file):创建时间
- 返回指定文件的创建时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算)
oa.path.getmtime(file) :修改时间
- 返回指定文件最新的修改时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算)
import os print(os.path.getatime('E:\\abc.txt')) #返回访问时间 print(os.path.getctime('E:\\abc.txt')) #返回创建时间 print(os.path.getmtime('E:\\abc.txt')) #返回修改时间
1591704113.4222739 1591704113.4222739 1591704113.4222739
用time模块的gmtime()或localtime()函数换算
import time import os print(time.gmtime(os.path.getatime('E:\\abc.txt'))) print(time.localtime(os.path.getmtime('E:\\abc.txt')))
time.struct_time(tm_year=2020, tm_mon=6, tm_mday=9, tm_hour=12, tm_min=19, tm_sec=41, tm_wday=1, tm_yday=161, tm_isdst=0) time.struct_time(tm_year=2020, tm_mon=6, tm_mday=9, tm_hour=20, tm_min=19, tm_sec=41, tm_wday=1, tm_yday=161, tm_isdst=0)
二. 文件读写
2.1 文件读操作
读取文本时,python将其中的所有文本都解读为字符串
语法规则:file = open(filename [,mode,encoding])
- file:被创建的文件对象
- open:创建文件对象的函数
- filename:要创建或打开的文件名称
- mode:打开默认为只读
- encoding:默认文本文件中字符的编写格式为gbk
例:读取磁盘文件的内容
file = open('a.txt', 'r') # 只读形式打开a.txt print(file.readlines()) # 逐行读取,返回列表,每行为以列表元素 file.close() # 打开之后都要关闭
['中国\n', '美丽']
方法二,效果一样,且不需close
with open('a.txt', 'r') as file: # 默认为只读,'r'其实可以省略 print(file.readlines())
2.2 文件写操作
例:新文件中写入一行
filename = "abc.txt" with open(filename, 'w') as file_object: file_object.write("zdb\n")
例:追加到旧文件中写入
filename = "abc.txt" with open(filename, 'a') as file_object: file_object.write("zzz\n") #在上面原有文件里追加一行数据
2.3 常用的文件打开模式
按文件中数据的组织形式,文件分为以下两大类
- 文本文件:存储的是普通“字符文本”,默认为unicode字符集,可以使用记本事程序打开
- 二进制文件:把数据内容用“字节”进行存储,无法用记事本打开,必须使用专用的软件打开,举例:mp3音频文件,jpg图片,doc文档等
打开模式 | 执行操作 |
‘r’ | 以只读方式打开文件(默认) |
‘w’ | 以写入的方式打开文件,会覆盖已存在的文件 |
‘x’ | 如果文件已经存在,使用此模式打开将引发异常 |
‘a’ | 以写入模式打开,如果文件存在,则在末尾追加写入 |
‘b’ | 以二进制模式打开文件,不能单独使用,需要与其它模式一起使用,如rb,wb |
‘t’ | 以文本模式打开(默认) |
‘+’ | 以读写模式打开,不能单独使用,需要与其它模式一起使用,如a+ |
‘U’ | 通用换行符支持 |
‘w’
1、open以写入的方式打开一个不存在的文件,便能创建一个新文件
file = open('b.txt', 'w') file.write('helloworld') file.close()
2、再次以写入的形式写进创建好的文件,便覆盖文件的内容
file = open('b.txt', 'w') file.write('python') file.close()
例2:
这里有两种打开文件的方法,同时两种写入文件的方法
# 一,使用print方式进行输出() fp = open('text.txt', 'w') print('奋斗成就更好的你', file=fp) # 这里也可以f.write() fp.close() """第二种方式,使用文件读写操作""" with open('text1.txt', 'w') as file: file.write('奋斗成就更好的你')
‘a’
把上述代码的’w’改成’a’,再运行一次,便在原来的基础上追加,所以结果显示两个python
file = open('b.txt', 'a') file.write('python') file.close()
但如果原来没有这个文件,便创建,如以下代码在不存在的c文件中写入
file = open('c.txt', 'a') file.write('python') file.close()
‘b’
这里进行图片的赋值,原图片为win.png,复制后命名为copy.png
# 进行图片的复制 src_file = open('win.png', 'rb') # 原文件,二进制读 target_file = open('copy.png', 'wb') # 目标文件,二进制写 target_file.write(src_file.read()) # 原文件读出,写入目标文件 target_file.close() # 关闭两个文件 src_file.close()
结果如下: