欢迎光临散文网 会员登陆 & 注册

【Python】文件操作用pathlib比os更简洁

2023-08-31 05:21 作者:PiKaChu345  | 我要投稿

本视频阐述的主要内容是,当我们使用python操作文件的时候,使用pathlib模块比使用os模块更简洁。

视频用五种不同情景下的代码做了一个对比。

文中出现的所有代码:

  • 删除目录下所有文件(包含子文件):
from pathlib import Path

def delete_all_contents_in_directory(src_dir):
    # First, delete all files and symlinks
    for entry in Path(src_dir).rglob('*'):
        if entry.is_file() or entry.is_symlink():
            entry.unlink()

    # Then, delete all directories
    for entry in Path(src_dir).rglob('*'):
        if entry.is_dir():
            try:
                entry.rmdir()
            except OSError:
                pass

if __name__ == "__main__":
    source_directory = 'my_dir'
    delete_all_contents_in_directory(source_directory)
  • 删除一个目录当中所有文件(不包含子目录)
from pathlib import Path

def delete_top_level_contents(src_dir):
    for entry in Path(src_dir).iterdir():
        if entry.is_file() or entry.is_symlink():
            entry.unlink()

if __name__ == "__main__":
    source_directory = 'my_dir'
    delete_top_level_contents(source_directory)

os的版本

import os

def delete_top_level_contents(src_dir):
    for entry_name in os.listdir(src_dir):
        entry_path = os.path.join(src_dir, entry_name)
        if os.path.isfile(entry_path) or os.path.islink(entry_path):
            os.remove(entry_path)

if __name__ == "__main__":
    source_directory = 'my_dir'
    delete_top_level_contents(source_directory)


  • 删除目录下指定格式的文件(不包含子目录)

os的版本

import os

def delete_specific_formats_with_os(src_dir, extensions):
    for entry_name in os.listdir(src_dir):
        entry_path = os.path.join(src_dir, entry_name)
        if os.path.isfile(entry_path) and os.path.splitext(entry_name)[1] in extensions:
            os.remove(entry_path)

if __name__ == "__main__":
    source_directory = 'my_dir'
    formats_to_delete = ['.txt', '.log']
    delete_specific_formats_with_os(source_directory, formats_to_delete)

pathlib的版本

from pathlib import Path

def delete_specific_formats_with_pathlib(src_dir, extensions):
    for entry in Path(src_dir).iterdir():
        if entry.is_file() and entry.suffix in extensions:
            entry.unlink()
if __name__ == "__main__":
    source_directory = 'my_dir'
    formats_to_delete = ['.txt', '.log']
    delete_specific_formats_with_pathlib(source_directory, formats_to_delete)
  • 删除给定目录下文件名当中包含特定关键词以及特定扩展名的文件(不包含子文件)
import os

def delete_files_with_keywords_with_os(src_dir, extensions, keywords):
    for entry_name in os.listdir(src_dir):
        entry_path = os.path.join(src_dir, entry_name)
        if os.path.isfile(entry_path) and os.path.splitext(entry_name)[1] in extensions:
            if any(keyword in entry_name for keyword in keywords):
                os.remove(entry_path)

if __name__ == "__main__":
    source_directory = 'my_dir'
    formats_to_delete = ['.txt', '.log']
    keywords_to_search = ['report', 'draft']
    delete_files_with_keywords_with_os(source_directory, formats_to_delete, keywords_to_search)

pathlib版本

from pathlib import Path

def delete_files_with_keywords_with_pathlib(src_dir, extensions, keywords):
    for entry in Path(src_dir).iterdir():
        if entry.is_file() and entry.suffix in extensions:
            if any(keyword in entry.name for keyword in keywords):
                entry.unlink()

if __name__ == "__main__":
    source_directory = 'my_dir'
    formats_to_delete = ['.txt', '.log']
    keywords_to_search = ['report', 'draft']
    delete_files_with_keywords_with_pathlib(source_directory, formats_to_delete, keywords_to_search)


  • 删除一个目录中名字符合某种pattern的文件(不包含子目录)


import os
import re

def delete_files_with_pattern_with_os(src_dir, pattern):
    for entry_name in os.listdir(src_dir):
        entry_path = os.path.join(src_dir, entry_name)
        if os.path.isfile(entry_path) and re.match(pattern, entry_name):
            os.remove(entry_path)

if __name__ == "__main__":
    source_directory = 'my_dir'
    pattern_to_search = r'^report_[0-9]{4}\.txt$'
    delete_files_with_pattern_with_os(source_directory, pattern_to_search)

pathlib的实现

from pathlib import Path
import re

def delete_files_with_pattern_with_pathlib(src_dir, pattern):
    for entry in Path(src_dir).iterdir():
        if entry.is_file() and re.match(pattern, entry.name):
            entry.unlink()

if __name__ == "__main__":
    source_directory = 'my_dir'
    pattern_to_search = r'^report_[0-9]{4}\.txt$'
    delete_files_with_pattern_with_pathlib(source_directory, pattern_to_search)



【Python】文件操作用pathlib比os更简洁的评论 (共 条)

分享到微博请遵守国家法律