一、遍历目录(包含子目录)中的所有文件
1、listdir方式
directory_or_file_list = os.listdir(path)
for directory_or_file in directory_or_file_list:
# new_path = f'{path}\\{directory_or_file}'
new_path = os.path.join(path,directory_or_file)
if os.path.isfile(new_path):
print(new_path)
else:
get_file_paths(new_path)
2、oswalk方式
print("遍历目录和文件")
for dirpath, dirnames, files in os.walk("D:\mydir3", topdown=True): # topdown = True表示路径从外向内遍历
print("found directory {}".format(dirpath)) # 打印目录路径
for file_name in files: # 打印文件名
print(file_name)
3、scandir方式
# 返回一个迭代器
file_iter = os.scandir("D:\input")
for file in file_iter:
# 直接判断,不用如同os.listdir,需要使用os.path.join(path,file)再判断
if file.is_file():
info = file.stat()
print('文件名{},最后修改时间为{}'.format(file.name,timestamp2datetime(info.st_mtime)))
elif file.is_dir():
pass
# print('子目录{}'.format(file.name))
3、综合应用:遍历某个目录的所有文件,并读取文件
(1)Common function
def fileoutput(path):
"""读取文件并打印文件内容
:param path: 文件完整路径
:return: 打印文件内容
"""
with open(path,'r') as f:
lines = f.read()
print(lines)
(2)方式1: 使用os.listdir
def get_file_paths(path):
"""
遍历某个文件夹下的所有文件
:param path: 文件夹路径
:return: 该文件夹(包括子文件夹)下所有的文件路径
"""
directory_or_file_list = os.listdir(path)
for directory_or_file in directory_or_file_list:
# new_path = f'{path}\\{directory_or_file}'
new_path = os.path.join(path,directory_or_file)
if os.path.isfile(new_path):
print(new_path)
fileoutput(new_path)
else:
get_file_paths(new_path)
>>测试
get_file_paths("D:\mydir3")
(3)方式2:使用os.walk
def get_file_paths2(path):
"""遍历某个文件夹下的所有文件
:param path: 文件夹路径
:return: 该文件夹(包括子文件夹)下所有的文件路径
"""
for dirpath, dirnames, files in os.walk(path, topdown=True): # topdown = True表示路径从外向内遍历
print("found directory {}".format(dirpath)) # 打印目录路径
for file_name in files: # 打印文件名
# 直接可以递归打印所有文件名
print(file_name)
print("打印文件内容")
fileoutput(os.path.join(dirpath,file_name))
>>测试
get_file_paths2("D:\mydir3")
(4)方式3:使用os.scandir
def get_file_paths3(path):
"""遍历某个文件夹下的所有文件
:param path: 文件夹路径
:return: 该文件夹(包括子文件夹)下所有的文件路径
"""
file_iter = os.scandir(path)
for file in file_iter:
# 直接判断,不用如同os.listdir,需要使用os.path.join(path,file)再判断
if file.is_file():
info = file.stat()
print('文件名{},最后修改时间为{}'.format(file.name,timestamp2datetime(info.st_mtime)))
print('输出文件内容')
fileoutput(file)
elif file.is_dir():
get_file_paths3(os.path.join(path,file))
# print('子目录{}'.format(file.name))
>>测试
get_file_paths3("D:\mydir3")
二、创建目录
1、创建单个目录方式1:os.mkdir
try:
dir = "D:/mydir"
os.mkdir(dir)
print(f"目录'{dir}'创建成功")
except FileExistsError as e:
print(e)
2、创建单个目录方式2:使用pathlib.Path
from pathlib import Path
dir2 = "D:/mydir2"
p = Path(dir2)
print(p)
try:
p.mkdir()
print(f"目录'{p}'创建成功")
except FileExistsError as e:
print(e)
3、创建多级目录方式1:使用os.makedirs
"""
层级:
- 2023
- 07
- 02
"""
dir3 = "D:/mydir2/2023/07/02"
try:
os.makedirs(dir3, mode=0o770)
print(f"目录'{dir3}'创建成功")
except FileExistsError as e:
print(e)
4、创建多级目录方式2:使用os.mkdir
from pathlib import Path
dir4 = "D:/mydir1/2023/07/02"
p2 = Path(dir4)
# parents: 允许创建02目录,及其所有父目录
# exist_ok: 允许目录存在也不会报错
try:
p2.mkdir(parents=True,exist_ok=True)
print(f"目录'{p2}'创建成功")
except:
pass
三、创建临时文件
1、简单应用
with tempfile.TemporaryFile('w+t') as fp:
# 临时文件中写入数据
fp.write('Hello world')
fp.seek(0)
# 读取文件
result = fp.read()
print(result)
2、临时文件命名
print("临时目录命名")
tmp = ''
with tempfile.TemporaryDirectory() as tmpdir:
print("create temporaryDirectory: {}".format(tmpdir)) # C:\Users\MAPLEA~2\AppData\Local\Temp\tmpb1dhzrw2
tmp = tmpdir # C:\Users\MAPLEA~2\AppData\Local\Temp\tmpb1dhzrw2
print(os.path.exists(tmpdir)) # True
print(tmp)
# 执行完毕,临时目录会被删除
print(os.path.exists(tmpdir)) # False
四、删除文件和目录
1、删除文件
(1)方式1:os.remove
print("删除文件")
del_filepath =r'D:\mydir1\2023\1.txt'
if os.path.isfile(del_filepath):
os.remove(del_filepath)
# os.unlink(del_filepath)
print(f"{del_filepath} delete successfully")
else:
print(f"Error {del_filepath} doesn't exist")
(1)方式2:使用pathlib中的Path
from pathlib import Path
del_data_file = Path(r"D:\mydir1\2023\1.txt")
try:
del_data_file.unlink()
except Exception as e:
print(f"Error:{del_data_file}:{e.strerror}")
2、删除目录
(1)方式1:os.rmdir
print('========= 删除目录===============')
trash_directory = r"D:\mydir1"
### 方式1 :os.rmdir
try:
os.rmdir(trash_directory)
# Path.rmdir()
print(f"{trash_directory} delete successfully")
except OSError as e:
print(f"Error:{trash_directory} : {e.strerror}")
(2)方式2:os.rmdir
### 方式2 :Path.rmdir
trash_directory2 = Path(r"D:\mydir2")
try:
trash_directory2.rmdir()
print(f"{trash_directory} delete successfully")
except OSError as e:
print(f"Error:{trash_directory2} : {e.strerror}")
(3)应用1:递归删除所有目录
import shutil
try:
shutil.rmtree(trash_directory) # 非空/空目录都可删除
print(f"{trash_directory} delete successfully")
except:
print(f"Error:{trash_directory} : {e.strerror}")
(4)应用2:递归删除所有非空目录
for dirpath,dirname,files in os.walk(r"D:\mydir2"):
try:
os.rmdir(dirpath)
except OSError as e:
# 如果目录非空,直接跳过
pass
五、判断是否文件或目录
os.path.isfile(r"D:\input") # False
os.path.isdir(r"D:\input") # True
六、文件名匹配
1、字符串方式
# 6-1 使用字符串方式
f_list = os.listdir(r"D:\input")
for f_name in f_list:
if f_name.endswith(".txt"):
print(f_name)
print('===========================')
2、使用fnmatch
import fnmatch
f_list = os.listdir(r"D:\input")
for f_name in f_list:
# 匹配所有crea开头的txt文件
if fnmatch.fnmatch(f_name,"crea*.txt"):
print(f_name)
七、文件复制、移动和重命名
1、文件复制
import shutil
src = "D:\input\chinese.txt"
dst = "D:\mydir\chinese.txt"
try:
print("开始文件复制")
shutil.copy(src,dst)
# shutil.copy2(src, dst) 保留文件元数据: 上次访问时间、权限位、上次修改时间和标志等
print("文件复制成功")
except Exception as e:
print(e)
2、目录复制
src_directory = "D:\input"
# 目标目录不能是已经存在的,否则会报错
dst_directory = r"D:\mydir2\2023\08"
try:
print(f"开始复制目录..from {src_directory} to {dst_directory}..")
dst = shutil.copytree(src_directory,dst_directory)
print("目录复制成功....")
except Exception as e:
print(e)
3、移动文件或目录
"""
Marks:
1. 如果dst目录不存在,那么src目录会被重命名为src目录
2. 如果dst目录存在,那么正常移动
"""
src_move_directory = "D:\mydir"
dst_move_directory = "D:\mydir2"
try:
# dst 是目标
print(f"开始移动目录..from {src_move_directory} to {dst_move_directory}..")
dst = shutil.move(src_move_directory,dst_move_directory)
print(dst)
print("移动目录成功")
except Exception as e:
print(e)
4、重命名文件或目录
print('=========7-4. 重命名文件或目录===============')
src_rename_file = r"D:\mydir2\mydir\chinese.txt"
dst_rename_file = r"D:\mydir2\mydir\chinese_new.txt"
try:
print("文件重命名开始..")
os.rename(src_rename_file,dst_rename_file)
print("文件重命名结束..")
except Exception as e:
print(e)
>>Before Rename
>>After Rename
八、文件归档
print('=========8-1. 打印压缩文件中的目录和文件名==============')
with zipfile.ZipFile(r"D:\mydir2\2023\07\my_zip.zip",'r') as zipobj:
name_list = zipobj.namelist()
for file in name_list:
# 获取每个文件的信息
file_info = zipobj.getinfo(file)
# 打印文件大小
print(file_info.file_size)
# 打印文件最新修改日期
print(file_info.date_time)
print(name_list)
九、读取多个文件
import fileinput
import sys
with fileinput.input(files = (r'd:\mydir2\2023\07\chinese_new.txt',
r'd:\mydir2\2023\07\chinese_old.txt')) as f:
for line in f:
if fileinput.isfirstline():
print(f'\n-- reading {fileinput.filename()} ---')
print('->' + line, end='')
十、判断是否绝对路径
print(os.path.isabs("D:\input")) # True
print(os.path.isabs("input")) #False
十一、文件路径拆解
print(os.path.split("D:\input\orders\input.txt")) # ('D:\\input\\orders', 'input.txt')
print(os.path.dirname("D:\input\orders\input.txt")) # D:\input\orders
print(os.path.basename("D:\inpu\orders\input.txt")) # input.txt
十二、获取绝对路径
# __file__是python的一个内置变量,表示当前脚本所在(相对)路径
print(os.path.abspath(__file__))
十三、拼接路径和文件名
print(os.path.join("D:\input\orders","input.txt")) # D:\input\orders\input.txt