作者:韩信子@ShowMeAI
教程地址:http://www.showmeai.tech/tuto…
本文地址:http://www.showmeai.tech/article-detail/86
申明:版权所有,转载请分割平台与作者并注明出处
咱们在理论开发中,常常须要对文件进行读取、遍历、批改等操作,通过 python 的规范内置os模块,可能以简洁高效的形式实现这些操作。常见的操作整顿如下:
要实现文件与目录的操作,首先导入对应的os模块,代码如下:
import os
2.文件夹操作
以本地 pythontest
目录作为演示目录,此目录下以后文件如下:
test
│ test.txt
└─test-1
test-1.txt
test
及 test-1
是文件夹,test.txt
及 test-1.txt
是文件。
在linux中咱们应用ls
/ pwd
/ cd
等实现查问与切换门路等操作,对应的python操作方法如下:
>>> os.chdir("./pythontest") # 更改目录
>>> os.getcwd() # 获取当前目录
'/Users/ShowMeAI/pythontest'
>>> os.listdir("test") # 文件及目录列表,相对路径
['test-1', 'test.txt']
>>> os.listdir("/Users/ShowMeAI/test") # 文件及目录列表,绝对路径
['test-1', 'test.txt']
>>> os.stat("test") # 获取目录信息
os.stat_result(st_mode=16877, st_ino=45805684, st_dev=16777221, st_nlink=11, st_uid=501, st_gid=20, st_size=352, st_atime=1634735551, st_mtime=1634735551, st_ctime=1634735551)
>>> os.stat("test/test.txt") # 获取文件信息
os.stat_result(st_mode=33188, st_ino=45812567, st_dev=16777221, st_nlink=1, st_uid=501, st_gid=20, st_size=179311, st_atime=1634699986, st_mtime=1634699966, st_ctime=1634699984)
其中 stat 函数返回的是文件或者目录的根本信息,具体如下:
日常应用中,咱们个别应用 st_size 、st_ctime 及 st_mtime 获取文件大小,创立工夫,批改工夫。另外,咱们看到输入的工夫是秒数,在这里提一下,对于日期的转换解决。
walk 函数对目录进行递归遍历,返回 root,dirs,files,别离对应以后的遍历的目录,此目录中的子目录及文件。
data = os.walk("test") # 遍历test目录
for root,dirs,files in data: # 递归遍历及输入
print("root:%s" % root)
for dir in dirs:
print(os.path.join(root,dir))
for file in files:
print(os.path.join(root,file))
>>> os.mkdir("new")
>>> os.mkdir("new1/new1-1") # 父目录不存在,报错
Traceback (most recent call last):
File "", line 1, in
FileNotFoundError: 零碎找不到指定的门路。: 'new1/new1-1'
>>> os.makedirs("new1/new1-1") # 父目录不存在,主动创立
>>> os.listdir("new1")
['new1-1']
>>> os.rmdir("new1") # 若目录不为空,报错
Traceback (most recent call last):
File "", line 1, in
OSError: 目录不是空的。: 'new1'
>>> os.rmdir("new1/new1-1")
>>> os.removedirs("new1/new1-1") # 删除多级空目录
>>> os.listdir(".")
['new']
因为删除空目录的限度,更多的是应用 shutil
模块中的 rmtree
函数,能够删除不为空的目录及其文件。
>>> os.makedirs("new1/new1-1")
>>> os.rename("new1/new1-1","new1/new1-2") # new1-1 new1-2
>>> os.listdir("new1")
['new1-2']
>>> os.rename("new1/new1-2","new2/new2-2") # 因为new2目录不存在,报错
Traceback (most recent call last):
File "", line 1, in
FileNotFoundError: 零碎找不到指定的门路。: 'new1/new1-2' -> 'new2/new2-2'
>>> os.renames("new1/new1-2","new2/new2-2") # renames可主动创立不存在的目录
>>> os.listdir("new2")
['new2-2']
如果指标门路文件曾经存在,那么os.rename()和os.renames()都会报错:FileExistsError,当文件已存在时,无奈创立该文件。
3.文件操作>>> f = os.open("test/test.txt", os.O_RDWR|os.O_CREAT) # 关上文件
>>> str_bytes = os.read(f,100) # 读100字节
>>> str = bytes.decode(str_bytes) # 字节转字符串
>>> print(str)
test write data
>>> os.close(f) # 敞开文件
留神 open/read/close 须要一起操作,其中 open 操作须要指定模式,上述是以读写模式关上文件,若文件不存在则创立文件。各模式具体如下:
flags — 该参数能够是以下选项,多个应用 “|” 隔开:
应用open创立文件,指定模式, 若文件不存在,则创立。有点相似 linux 操作中的 touch。
>>> f = os.open("test/ShowMeAI.txt", os.O_RDWR|os.O_CREAT) # 若文件不存在,则创立
>>> os.close(f)
>>> f = os.open("test/ShowMeAI.txt", os.O_RDWR|os.O_CREAT) # 关上文件
>>> os.write(f,b"ShowMeAI test write data") # 写入内容
15
>>> os.close(f) # 敞开文件
>>> os.remove("test/test-1") # 删除目录报错
Traceback (most recent call last):
File "", line 1, in
FileNotFoundError: 零碎找不到指定的文件。: 'test/test1'
>>> os.remove("test/ShowMeAI.txt") # 删除文件
>>> os.listdir("test")
['test-1']
4.门路操作
在应用文件或目录过程中,常常须要对文件及目录门路进行解决,因而,os 中有一个子模块 path,专门就是解决门路操作的。次要有以下操作:
>>> os.path.abspath("test")
'/Users/ShowMeAI/test'
>>> os.path.exists("test")
True
>>> os.path.exists("test/test.txt")
False
>>> os.path.exists("test/test-1/test-1.txt")
True
>>> os.path.isdir("test")
True
>>> os.path.isfile("test/test-1/test-1.txt")
True
/
为宰割符,分为头(head) 和尾(tail)两局部,tail 是 basename 返回的内容,head 是 dirname 返回的内容。常常用于获取文件名,目录名等操作>>> os.path.basename("test/test-1/test-1.txt") # 文件名
'test-1.txt'
>>> os.path.basename("test/test-1/") # 空内容
''
>>> os.path.basename("test/test-1") # 目录名
'test-1'
>>> os.path.dirname("test/test-1/test-1.txt") # 文件所在目录门路
'test/test-1'
>>> os.path.dirname("test/test-1/") # 目录门路
'test/test-1'
>>> os.path.dirname("test/test-1") # 父目录门路
'test'
>>> os.path.join("test","test-1") # 连贯两个目录
'test/test-1'
>>> os.path.join("test/test-1","test-1.txt") # 连贯目录与文件名
'test/test-1/test-1.txt'
>>> os.path.split("test/test-1") # 宰割目录
('test', 'test-1')
>>> os.path.split("test/test-1/") # 以/结尾的目录宰割
('test/test-1', '')
>>> os.path.split("test/test-1/test-1.txt") # 宰割文件
('test/test-1', 'test-1.txt')
>>> os.path.splitext("test/test-1")
('test/test-1', '')
>>> os.path.splitext("test/test-1/")
('test/test-1/', '')
>>> os.path.splitext("test/test-1/test-1.txt") # 辨别文件名及扩展名
('test/test-1/test-1', '.txt')
>>> os.path.splitext("test/test-1/test-1.txt.mp4") # 以最初的"."为宰割点
('test/test-1/test-1.txt', '.mp4')
5.典型利用
def batch_rename(dir_path):
itemlist = os.listdir(dir_path)
# 获取目录文件列表
for item in itemlist:
# 连接成残缺门路
item_path = os.path.join(dir_path, item)
print(item_path)
# 批改文件名
if os.path.isfile(item_path):
splitext = os.path.splitext(item_path)
os.rename(item_path, splitext[0] + "-ShowMeAI" + splitext[1])
def walk_ext_file(dir_path, ext_list):
# @dir_path参数:遍历的目录
# @ext_list参数:拓展名列表,例['.mp4', '.mkv', '.flv']
# 遍历
for root, dirs, files in os.walk(dir_path):
# 获取文件名称及门路
for file in files:
file_path = os.path.join(root, file)
file_item = os.path.splitext(file_path)
# 输入指定扩展名的文件门路
if file_item[1] in ext_list:
print(file_path)
def sort_file_accord_to_time(dir_path):
# 排序前
itemlist = os.listdir(dir_path)
print(itemlist)
# 正向排序
itemlist.sort(key=lambda filename: os.path.getmtime(os.path.join(dir_path, filename)))
print(itemlist)
# 反向排序
itemlist.sort(key=lambda filename: os.path.getmtime(os.path.join(dir_path, filename)), reverse=True)
print(itemlist)
# 获取最新批改的文件
print(itemlist[0])
6.视频教程
请点击到B站查看【双语字幕】版本
https://www.bilibili.com/vide…
材料与代码下载本教程系列的代码能够在ShowMeAI对应的github中下载,可本地python环境运行,能迷信上网的宝宝也能够间接借助google colab一键运行与交互操作学习哦!
本教程系列波及的Python速查表能够在以下地址下载获取: