大家好,我是星源,一个正在自学Python的19岁编程小白 🤓。这是我的学习笔记系列,我会把每天学到的知识点整理出来,分享给同样在路上的小伙伴,希望能和大家一起进步 🚀。
📌 今日学习内容
👉 "今天我们来学习文件组织技巧与Python调试方法"
✨ 知识点讲解
shutil模块:文件复制、移动与改名
概念说明:shutil模块提供了多个函数,用于文件和文件夹的复制、移动、改名和删除操作。例如,shutil.copy()用于复制文件,shutil.move()用于移动或改名文件。
代码示例:
importshutil, os# 复制文件shutil.copy('source.txt', 'destination_folder')shutil.copytree('source_folder', 'destination_folder')# 移动和改名文件shutil.move('source.txt', 'destination_folder/new_name.txt')小提示:在使用shutil.move()时,如果目标路径的文件夹不存在,可能会引发错误,需提前确保文件夹存在。
文件和文件夹的删除
概念说明:可以使用os模块中的函数删除文件或文件夹,但需谨慎操作以免误删数据。
代码示例:
importos# 删除文件os.unlink('file.txt')# 删除空文件夹os.rmdir('empty_folder')# 删除非空文件夹及其内容shutil.rmtree('non_empty_folder')小提示:对于重要文件,建议使用send2trash模块发送到回收站,以便后续恢复:
importsend2trashsend2trash.send2trash('important_file.txt')遍历目录树
概念说明:使用os.walk()函数可以遍历一个文件夹及其所有子文件夹。
代码示例:
importosforfolder_name, subfolders, filenamesinos.walk('target_folder'):print(f'Current folder: {folder_name}')forsubfolderinsubfolders:print(f'Subfolder: {subfolder}')forfilenameinfilenames:print(f'File: {filename}')小提示:os.walk()会返回当前文件夹名称、子文件夹列表和文件列表,利用它可以轻松处理大量文件。
压缩与解压文件
概念说明:利用zipfile模块可以创建、读取和解压ZIP文件。
代码示例:
importzipfile# 创建ZIP文件withzipfile.ZipFile('new.zip', 'w') asnew_zip:new_zip.write('file.txt', compress_type=zipfile.ZIP_DEFLATED)# 解压ZIP文件withzipfile.ZipFile('existing.zip') asexisting_zip:existing_zip.extractall('extract_folder')小提示:在创建ZIP文件时,write()方法的compress_type参数可以指定压缩算法。
项目:日期格式转换
概念说明:编写一个程序,将文件名中的美国风格日期(MM-DD-YYYY)转换为欧洲风格日期(DD-MM-YYYY)。
代码示例:
importshutil, os, re# 定义正则表达式匹配美国风格日期date_pattern=re.compile(r""" ^(.*?) # 日期前的文本 ((0|1)?\d)- # 月份 ((0|1|2|3)?\d)- # 日期 ((19|20)\d\d) # 年份 (.*?)$ # 日期后的文本""", re.VERBOSE)# 遍历文件夹中的文件forfilenameinos.listdir('.'):mo=date_pattern.search(filename)ifmoisNone:continue# 提取日期部分before_part=mo.group(1)month_part=mo.group(2)day_part=mo.group(4)year_part=mo.group(6)after_part=mo.group(8)# 构建新文件名euro_filename=f"{before_part}{day_part}-{month_part}-{year_part}{after_part}"abs_working_dir=os.path.abspath('.')american_filename=os.path.join(abs_working_dir, filename)euro_filename=os.path.join(abs_working_dir, euro_filename)# 重命名文件print(f'Renaming "{filename}" to "{euro_filename}"...')shutil.move(american_filename, euro_filename)小提示:在运行文件重命名程序之前,先打印出将要重命名的文件,以确保程序逻辑正确。
项目:备份文件夹到ZIP
概念说明:创建一个程序,将指定文件夹备份到ZIP文件中,每次备份生成新的文件名。
代码示例:
importzipfile, osdefbackup_to_zip(folder):folder=os.path.abspath(folder)number=1whileTrue:zip_filename=os.path.basename(folder) +'_'+str(number) +'.zip'ifnotos.path.exists(zip_filename):breaknumber+=1# 创建ZIP文件print(f'Creating {zip_filename}...')withzipfile.ZipFile(zip_filename, 'w') asbackup_zip:forfoldername, subfolders, filenamesinos.walk(folder):print(f'Adding files in {foldername}...')backup_zip.write(foldername)forfilenameinfilenames:new_base=os.path.basename(folder) +'_'iffilename.startswith(new_base) andfilename.endswith('.zip'):continuebackup_zip.write(os.path.join(foldername, filename))print('Done.')backup_to_zip('target_folder')小提示:在备份过程中,跳过备份生成的ZIP文件本身,以避免无限递归。
习题
shutil.copy()与shutil.copytree()的区别:shutil.copy()用于复制单个文件,而shutil.copytree()用于复制整个文件夹及其内容。
文件改名函数:shutil.move()可以用于文件改名。
send2trash与shutil删除函数的区别:send2trash将文件发送到回收站,而shutil的删除函数永久删除文件。
ZipFile对象的close()方法:与File对象的close()方法类似,用于关闭ZIP文件。
ZipFile对象的open()方法:等价于File对象的open()方法,用于打开ZIP文件。
✅ 总结
文件操作:掌握shutil模块的基本用法,包括文件复制、移动和删除。
目录遍历:利用os.walk()遍历文件夹结构,处理大量文件。
压缩与解压:通过zipfile模块操作ZIP文件,实现文件压缩与解压。
日期格式转换项目:实践正则表达式与文件操作,实现文件名日期格式转换。
文件夹备份项目:综合运用文件操作与ZIP功能,实现文件夹备份。
📢 互动提问
你在处理文件组织任务时,遇到过哪些棘手的问题?是如何解决的?