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

