【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)