1.文件路径模块用法
1.1.os|shutil|glob|sys|pathlib
1.1.1.基本语法
import datetime
import os
import shutil
import glob
import re
import sys
import pathlib
from pathlib import Path
from filecmp import cmp
def os_info():
"""操作系统,目录基本信息"""
print(os.name)
print(os.environ)
print(os.sep)
print(os.pathsep)
print(repr(os.linesep))
def os_dir():
"""目录的创建,移除,多级创建,移除"""
shutil.rmtree('a', ignore_errors=True)
def os_dir_create():
if os.path.exists('1'):
print('纯在')
else:
os.mkdir('1')
os.makedirs('111/2/3/4/5')
def os_path_is():
"""目录,或者文件信息"""
print(os.getcwd())
file = os.getcwd() + '/tem.py'
print(os.path.split(file))
print(os.path.isabs(file))
print(os.path.exists(file))
print(os.path.getatime(file))
print(os.path.getctime(file))
print(os.path.getmtime(file))
print(os.path.getsize(file))
print(os.getcwd())
os.chdir('C:/Users/')
print(os.getcwd())
dir_list = os.listdir()
print(dir_list)
for d in dir_list:
print(d, os.path.isdir(d), os.path.isfile(d))
def os_scsndir():
"""迭代器扫描当下文件"""
dir_list1 = os.scandir()
print(dir_list1)
for d in dir_list1:
print(d, d.name, d.is_dir())
print(d.stat().st_size)
print(d.stat().st_ctime)
print(datetime.datetime.fromtimestamp(d.stat().st_ctime))
def os_walk():
"""递归遍历当下所有文件目录"""
for dirpath, pathnames, filenames in os.walk('./'):
print(
dirpath,
pathnames,
filenames,
)
def glob_base():
"""查找匹配文件,目录"""
os.chdir(r'C:\Users\Public\Documents')
list1 = glob.glob('001*')
print(list1)
list3 = glob.glob(
pathname='**/',
recursive=True,
)
print(list3)
list4 = glob.glob('**/*.py', recursive=True)
for i in list4:
if re.search(r'.*00.*\.py', i):
print('在')
print(list4)
def shutil_copy():
"""shutil的基本用法"""
shutil.copy(
'tem.py', 'a1')
shutil.copypytree('web_spider', '.dea/aaa')
shutil.move('web_spider', '.dea/aaa')
shutil.rmtree('a1')
def sys_base():
"""通常用于解释器的交互"""
args = sys.argv
print(args)
print(args[0])
print('Hello, world!', file=sys.stdout)
print('An error occurred!', file=sys.stderr)
print(
sys.version,
sys.version_info,
sys.winver,
sys.platform,
sys.path,
sys.maxsize,
sys.maxunicode,
sys.copyright,
sys.modules,
sys.byteorder,
sys.executable,
sys.builtin_module_names,
sep='\n'
)
sys.exit()
def pathlib_path():
"""pathlib是os.path的升级替代版,实现了路线优化,对象有:PurePath,PurePosixPath,Path,PureWindowsPath,PosixPath,WindowsPath
继承关系:
PurePath:[PurePosixPath,Path,PureWindowsPath]
[PurePosixPath,Path]:PosixPath
[Path,PureWindowsPath]:WindowsPath"""
"""Path主要是虚拟路径的字符串操作,不一定真实"""
p = pathlib.Path()
p1 = Path(r'd:\a\b\c')
p1.mkdir(exist_ok=True, parents=True)
print(
'=' * 100,
p,
p.resolve(),
p.home(),
pathlib.Path.home(),
p.cwd(),
pathlib.Path.cwd(),
pathlib.Path('a', 'b', 'c', 'd/e'),
pathlib.Path('//a//b///c..d....e/f'),
'k' / Path.home() / 'dir' / 'file.txt',
'k' / Path('a/s/d') / 'm',
Path.home().joinpath('dir', 'file.txt'),
sep='\n'
)
p2 = pathlib.Path(r'D:\Users\Pictures')
print(
'# ' * 100,
p2.iterdir(),
p2.glob('*'),
p2.rglob('*'),
p2.glob('*.py'),
list(p2.glob('*.py')),
p2.rglob('*.py'),
Path('C:/Users/1.txt').match('**/*.txt'),
sep='\n',
)
for i in p2.rglob('*'):
print(i)
f = Path(r'd:\a\b\c\d\e\test.py')
if f.exists():
print('文件存在!')
else:
if Path(r'd:\a\b\c\d\e').exists():
f.touch()
else:
Path(r'd:\a\b\c\d\e').mkdir(exist_ok=True, parents=True)
f.touch()
f1 = Path(r'd:\a\b\c\d\demo.py')
print(
'=' * 100,
f1.anchor,
f1.name,
f1.stem,
f1.suffix,
f1.suffixes,
f1.parent,
f1.parents,
f1.parts,
f1.with_name('x.text'),
f1.with_suffix('.jpg'),
f1.stat(),
f1.stat().st_size,
f1.stat().st_ctime,
f1.stat().st_mtime,
sep='\n',
)
for i in f1.parents:
print(i)
print(
'- ' * 100,
f1.exists(),
f1.is_dir(),
f1.is_file(),
f1.is_symlink(),
f1.is_socket(),
f1.is_block_device(),
f1.is_char_device(),
f1.is_absolute(),
sep='\n',
)
f2 = Path(r'D:\a\b\c\d\e\1.txt')
with f2.open(encoding='utf-8') as f:
print(f.readline())
f2.write_text('Text file contents')
print(
'-' * 100,
f2.read_text(),
sep='\n',
)
if __name__ == '__main__':
sys_base()
pass
1.1.2.算法
import glob
import os
import shutil
import datetime
def os001():
"""文件,文件夹分类"""
path = input('Please input a path:')
os.chdir(path=path)
l = os.scandir()
file_list = []
dir_list = []
for d in l:
if d.is_dir():
dir_list.append(d.name)
else:
file_list.append(d.name)
print(fr'文件夹的数量有{len(dir_list)}个,分别是{dir_list}')
print('文件的数量有%s,分别是%s' % (len(file_list), file_list))
f_001 = []
for i in file_list:
if 'a' in i.lower():
f_001.append(i)
print('a的文件有{}个,分别是{}'.format(len(f_001), f_001))
def os002():
"""寻找大于30M,并且20天前修改的的zip,"""
path = input('please input path:')
os.chdir(path)
paths = glob.glob('**/*.zip', recursive=True)
for path in paths:
file_size = os.stat(path).st_size / 1024 / 1024
file_modify = datetime.datetime.fromtimestamp(os.stat(path).st_mtime)
days = (datetime.datetime.now() - file_modify).days
if (file_size > 30) and (days > 20):
print(f'压缩包的名称是{path},\t大小是{round(file_size, 2)}MB,\t{days}天前修改')
def os003():
"""从命名某类文件,并且移动到新的地方"""
path = input('请输入路径:')
os.chdir(path)
if not os.path.exists('最新视频1'):
os.mkdir('最新视频1')
for dirpath, dirname, filename in os.walk('./'):
for file in os.scandir(dirpath):
if file.name.endswith('.mp4'):
tm = datetime.datetime.fromtimestamp(
file.stat().st_mtime)
newname = str(tm.year) + '_' + str(tm.month) + \
'_' + str(tm.day) + '_' + file.name
os.rename(dirpath + '/' + file.name, newname)
file_list = glob.glob('*.mp4')
for name in file_list:
shutil.move(name, '最新视频1')
def os004():
"""文件分类整理"""
screach_path = r'C:\Users\Public\Downloads'
os.chdir(screach_path)
new_path = './分类文件夹'
if not os.path.exists(new_path):
os.mkdir(new_path)
file_num = 0
dir_num = 0
for i in glob.glob(f'{screach_path}/**/*', recursive=True):
if os.path.isfile(i):
filename = os.path.basename(i)
if '.' in filename:
suffix = filename.split('.')[-1]
else:
suffix = 'others'
if not os.path.exists(f'{new_path}/{suffix}'):
os.mkdir(f'{new_path}/{suffix}')
dir_num += 1
shutil.copy(i, f'{new_path}/{suffix}')
file_num += 1
print(f"整理完成,共有{dir_num}类文件,{file_num}个文件")
def pathlib_find_path():
"""通过关键字查找某个文件夹下文件,目录路径"""
while True:
folder = input('请输入要查找的文件夹路径:')
folder = Path(folder.strip())
if folder.is_dir() and folder.exists():
break
else:
print('亲,输入的路径有误或者不准确,请重新输入')
search = input('请输入要查找的文件名称:')
result = list(folder.rglob(f'*{search}*'))
if not search:
print(f"在{folder}文件夹下,没有找到含有{search}的文件")
else:
result_folder = []
result_file = []
for i in result:
if i.is_dir():
result_folder.append(i)
else:
result_file.append(i)
if result_folder:
print(f'查找到包含{search}的文件夹有:')
for i in result_folder:
print(i)
if result_file:
print(f'查找到包含有{search}的文件有:')
for i in result_file:
print(i)
def pathlib_find_duplicate_file():
"""查找当下文件夹中重复的文件,移动多余重复的到新文件夹"""
scr_folder = Path('./')
dest_folder = Path('./重复文件')
if not dest_folder.exists():
dest_folder.mkdir(parents=True)
list_file = []
path_list = list(scr_folder.rglob('*'))
for file in path_list:
if file.is_file():
list_file.append(file)
for m in list_file:
for n in list_file:
if m != n and m.exists() and n.exists():
if cmp(m, n):
n.replace(dest_folder / n.name)
if __name__ == '__main__':
pathlib_path()
pass