文件系统操作

一、遍历目录(包含子目录)中的所有文件

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


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值