Python基础 —— 获取当前文件所在目录,遍历当前目录,获取指定后缀的文件

In [54]:
x
import os, sys
×
In [55]:
 
# 获取当前目录
os.getcwd()
×
Out[55]:
'C:\\Users\\rHotD\\Documents\\GitHub\\Machine_Learning_In_Action\\Machine Learning In Action With Pandas and Scikit-learn\\chapter-04'
In [56]: </
<think>我们有一个明确的任务:用Python解压当前目录下的压缩文件。 根据引用[3]中的代码,我们可以看到一个递归解压zip文件的函数,它能够解压当前目录及其子目录中的所有zip文件。 但是,用户的需求是解压当前目录下的压缩文件,可能不需要递归(除非特别说明)。不过引用[3]的代码是递归解压的,并且解压后删除原压缩文件(注释状态)。 我们可以根据需求调整: 需求1:只解压当前目录下的zip文件,不处理子目录(除非用户要求递归)。 需求2:解压后,将压缩文件的内容释放到当前目录,或者以压缩文件名命名的子目录中(根据引用[2],用户可能希望平铺展开,即不保留目录结构)。 然而,引用[2]提供了不保留目录结构的方法,但引用[3]的代码是保留目录结构的(因为使用extractall到以压缩文件名命名的目录)。 我们需要明确: 1. 用户是否希望递归解压(即包括子目录中的zip)?从问题描述看,用户只说“当前目录”,所以我们可以先不考虑子目录。 2. 用户是否希望解压后删除原压缩文件?引用[3]的代码有删除操作(注释状态),我们可以询问或由用户决定。 3. 用户是否希望平铺展开(即解压后的文件直接放在当前目录,而不放在压缩文件名的文件夹里)? 但是,用户的问题没有明确这些细节。因此,我们可以提供两种方案,或者按照最常见的方式:解压到以压缩文件名(去掉扩展名)命名的文件夹,并且不递归子目录(除非用户指定)。 然而,引用[3]的代码是递归解压的,并且会解压所有子目录中的zip文件。如果用户不需要递归,我们可以修改。 根据问题,我们只处理当前目录下的zip文件,不包括子目录。 另外,引用[2]提到不保留目录结构的方法,即把每个文件提取到指定目录(平铺)。我们可以提供两种方式供选择。 因此,我们可以写一个函数,实现以下功能: - 解压当前目录下所有zip文件(不包括子目录) - 可以选择解压到以压缩文件名为名的文件夹(保留压缩文件内的目录结构)或者平铺到当前目录(不保留压缩文件内的目录结构) - 可以选择是否删除原压缩文件 但是,为了简化,我们先提供一个基本版本:解压到以压缩文件名命名的文件夹(保留结构),不删除原文件。 如果用户需要平铺,我们可以参考引用[2]的方法:遍历zip中的每个文件,将文件提取到目标目录,但忽略文件在zip中的路径。 注意:平铺时如果遇到同名文件,可能会覆盖,需要小心。 考虑到这些,我们分步骤: 方案1:保留目录结构(默认) 对当前目录的每个zip文件,创建一个与zip文件同名的目录(不含.zip),然后将zip中的所有文件解压到这个目录中。 方案2:平铺(不保留目录结构) 将zip中的每个文件直接提取到当前目录(或者指定目录),如果zip中有多个文件,它们会被直接放在当前目录,可能会造成混乱(如果多个zip有同名文件,会被覆盖)。 因此,平铺方式需要谨慎。通常建议使用方案1,这样每个压缩包的内容在一个单独的文件夹里。 根据引用[3]的代码,我们可以修改,使其只处理当前目录,不递归,并且不删除原文件。 基本步骤: 1. 获取当前目录。 2. 列出当前目录下所有zip文件。 3. 对每个zip文件,用zipfile模块读取。 4. 创建目标文件夹(以zip文件名去掉扩展名命名)—— 用于存放解压内容。 5. 使用extractall方法解压到目标文件夹。 如果用户要求平铺,那么我们可以: - 不创建目标文件夹,而是直接解压到当前目录(但这样多个压缩包的内容会混在一起) - 或者,我们可以创建一个文件夹,然后将文件平铺到该文件夹(这样每个压缩包的内容还是在自己的文件夹里,但文件夹内没有压缩包内部的目录结构) 这里,我们采用第二种平铺方式:即每个压缩包解压到一个文件夹,但文件夹内不保留压缩包内的目录结构。 具体做法: 对于每个文件在zip文件中,我们只取文件名(不包含路径),然后将其写入到目标文件夹中。注意:如果压缩包中有多个同名文件(在不同目录下),这样会覆盖。 因此,我们提供两个函数: unzip_keep_structure(): 保留结构解压 unzip_flatten(): 平铺解压(不保留结构) 另外,我们可以添加一个选项,是否删除原压缩文件。 由于用户问题没有明确,我们先写一个简单的版本:只解压当前目录下的zip,保留结构,不删除原文件。 代码示例(基本功能): ```python import os import zipfile def unzip_current_dir(flat=False, remove_zip=False): current_dir = os.getcwd() # 获取当前目录 zip_files = [f for f in os.listdir(current_dir) if f.endswith('.zip')] for zip_file in zip_files: zip_path = os.path.join(current_dir, zip_file) # 目标文件夹:去掉.zip后缀 extract_dir = os.path.join(current_dir, zip_file[:-4]) # 如果目标文件夹不存在,创建 if not os.path.exists(extract_dir): os.makedirs(extract_dir) with zipfile.ZipFile(zip_path, 'r') as z: if flat: # 平铺模式:遍历每个文件,只取文件名(不包含路径)并解压到目标文件夹 for file_info in z.infolist(): # 跳过目录 if file_info.is_dir(): continue # 获取文件名(不含路径) file_name = os.path.basename(file_info.filename) # 如果文件名为空,跳过(通常不会) if not file_name: continue # 生成目标路径 target_path = os.path.join(extract_dir, file_name) # 确保目标目录存在(如果压缩包中有子目录,我们忽略子目录,但可能多个文件同名?) # 为了避免覆盖,我们可以使用一个计数器?但这里简单处理,直接覆盖(因为每个压缩包单独文件夹,所以一般不会冲突) # 使用z.extract(file_info, extract_dir) 然后重命名?但这样会创建子目录结构,所以我们用另一种方法:读取文件内容再写入 # 或者,我们可以用z.open然后写入到目标文件 source = z.open(file_info) with open(target_path, 'wb') as target: target.write(source.read()) source.close() else: # 保留结构:直接解压到目标文件夹 z.extractall(extract_dir) if remove_zip: os.remove(zip_path) # 调用示例:解压当前目录下所有zip文件,保留结构,不删除原文件 unzip_current_dir(flat=False, remove_zip=False) ``` 注意:平铺模式中,我们跳过了目录,只解压文件。如果压缩包中有一个空目录,那么它会被忽略。如果压缩包中有多个同名文件(即使在不同目录下),在平铺时会被覆盖(后解压的覆盖先解压的)。因此,平铺模式有风险。 另外,我们创建的目标文件夹是以压缩文件名(去掉.zip)命名的,这样每个压缩包的内容都在自己的文件夹里,不会混乱。 如果用户希望将多个压缩包的内容都解压到同一个目录(比如当前目录),那么我们可以将extract_dir设置为当前目录,但这样会非常混乱,不推荐。因此,我们按每个压缩包一个文件夹的方式。 根据用户问题,我们只解压当前目录下的zip文件,不包括子目录。 现在,我们可以根据用户的需求调用这个函数。例如,如果用户希望平铺模式,可以设置flat=True;如果希望解压后删除原压缩文件,设置remove_zip=True。 但是,用户可能只需要基本功能,所以我们也可以提供一个简单的版本,只保留结构解压,不删除原文件。 简单版本: ```python import os import zipfile def unzip_current_dir_simple(): current_dir = os.getcwd() for file in os.listdir(current_dir): if file.endswith('.zip'): zip_path = os.path.join(current_dir, file) extract_dir = os.path.join(current_dir, file[:-4]) if not os.path.exists(extract_dir): os.makedirs(extract_dir) with zipfile.ZipFile(zip_path, 'r') as z: z.extractall(extract_dir) unzip_current_dir_simple() ``` 这个简单版本没有平铺选项,也不删除原文件。 根据引用[3],原代码是递归解压的,但我们这里不需要递归,所以只处理当前目录。 用户可以根据需要选择使用哪个函数。 最后,我们提醒用户:如果压缩文件很大或者很多,请谨慎操作。另外,平铺模式可能会因为文件名冲突导致数据丢失,请确保压缩包内没有同名文件。 因此,我们回答用户的问题:使用以上代码即可解压当前目录下的压缩文件(zip格式)。 注意:我们只处理zip格式,其他压缩格式(如rar、7z)需要其他库。 如果用户需要处理其他格式,可以建议安装相应的库(如rarfile,但可能需要unrar工具),但这超出了当前问题范围。 现在,我们写出回答。</think>### Python解压当前目录下的压缩文件 要解压当前目录中的所有压缩文件(`.zip`格式),可以使用Python内置的`zipfile`模块。以下是完整的解决方案: ```python import os import zipfile def unzip_current_directory(): """解压当前目录下的所有zip文件""" current_dir = os.getcwd() # 获取当前目录路径 for filename in os.listdir(current_dir): if filename.endswith('.zip'): zip_path = os.path.join(current_dir, filename) # 创建解压目录(以压缩文件名命名) extract_dir = os.path.join(current_dir, filename[:-4]) os.makedirs(extract_dir, exist_ok=True) # 解压文件 with zipfile.ZipFile(zip_path, 'r') as zip_ref: zip_ref.extractall(extract_dir) print(f"已解压: {filename} → {extract_dir}") if __name__ == "__main__": unzip_current_directory() ``` ### 功能说明: 1. **自动检测压缩文件**:扫描当前目录下所有`.zip`文件 2. **创建独立目录**:为每个压缩包创建同名文件夹(去掉`.zip`后缀) 3. **完整解压**:保留压缩包内的目录结构 4. **安全操作**:不会覆盖或删除原始压缩文件 ### 使用步骤: 1. 将上述代码保存为`unzip_files.py` 2. 将该脚本放在包含压缩文件目录中 3. 运行脚本: ```bash python unzip_files.py ``` ### 示例效果: ``` 当前目录结构: ├── archive1.zip ├── archive2.zip └── unzip_files.py 运行后: ├── archive1/ # 解压生成 │ ├── file1.txt │ └── folder1/ ├── archive2/ # 解压生成 │ ├── image.jpg │ └── document.pdf ├── archive1.zip # 原始文件保留 ├── archive2.zip # 原始文件保留 └── unzip_files.py ``` > **注意**:此脚本仅处理ZIP格式,其他格式(如RAR/7z)需使用专用库。解压大型文件时请确保磁盘空间充足[^1]。 ### 高级选项: 1. **解压后删除原始压缩文件**(在`with`代码块后添加): ```python os.remove(zip_path) # 解压后删除原始文件 ``` 2. **平铺解压(不保留目录结构)**: ```python # 替换 extractall 为以下代码 for file in zip_ref.infolist(): if not file.is_dir(): zip_ref.extract(file, extract_dir) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值