如何使用Python从zip文件中提取所有的.txt文件?
随着数据处理越来越普遍,我们常常需要把数据打包成压缩包来传递或者存储。如果我们想提取压缩包中指定类型的文件,比如txt文件,一个一个手动解压显然非常麻烦,而且容易出错。利用Python的zipfile库,我们可以快速、便捷地从zip文件中提取所有的txt文件。
阅读更多:Python 教程
准备工作
在进行操作之前,我们需要先导入zipfile库:
import zipfile
接着,我们需要准备好要操作的zip文件和提取文件的条件。假设我们有一个名为”data.zip”的zip文件被放置在D盘根目录下,其中有些文件是txt文件。为方便演示,我们可以先新建一个test文件夹,将zip文件放在其中:
D:\test\data.zip
要从zip文件中提取所有的txt文件,我们需要先定义一个函数,将所有txt文件的文件名存入一个列表中,然后遍历列表,依次提取每个txt文件到指定的位置。
代码实现
代码的实现分为两部分,第一部分是将txt文件名存入列表中,第二部分是依次提取每个txt文件。
第一部分:获取txt文件名
def get_txt_file_list(zip_file):
"""
获取zip文件中所有的txt文件名
"""
txt_file_list = []
with zipfile.ZipFile(zip_file, 'r') as myzip:
# 获取zip文件中所有文件名
file_names = myzip.namelist()
# 遍历所有文件名,筛选出txt文件
for file_name in file_names:
if file_name.endswith('.txt'):
txt_file_list.append(file_name)
# 返回txt文件名列表
return txt_file_list
上面的代码定义了一个名为get_txt_file_list的函数。它有一个参数zip_file,表示要提取文件的zip文件路径。函数的实现分为两步:
- 使用ZipFile类打开zip文件,获取所有文件名。
- 遍历所有文件名,筛选出所有的txt文件名。
我们可以使用结束符”.endswith”筛选出所有以”.txt”结尾的文件名,并将它们添加到txt_file_list中。
在这里需要注意的是,我们使用了with结构来打开zip文件,这样可以确保文件在使用完后被正确关闭,避免出现文件句柄未释放的问题。
第二部分:提取txt文件
def extract_txt_files(zip_file, dest_dir):
"""
提取zip文件中的txt文件到指定目录
"""
# 创建目录
if not os.path.exists(dest_dir):
os.makedirs(dest_dir)
# 获取txt文件名列表
txt_file_list = get_txt_file_list(zip_file)
# 遍历txt文件名列表,依次提取txt文件到目标目录
with zipfile.ZipFile(zip_file, 'r') as myzip:
for file_name in txt_file_list:
# 读取zip文件中的txt文件内容
content = myzip.read(file_name).decode('utf-8')
# 指定文件名并保存到目标目录
file_path = os.path.join(dest_dir, os.path.basename(file_name))
with open(file_path, 'w', encoding='utf-8') as f:
f.write(content)
print(f"已将{zip_file}中所有的txt文件提取到{dest_dir}中")
上面的代码定义了一个名为extract_txt_files的函数。它有两个参数:zip_file表示要提取文件的zip文件路径,dest_dir表示提取文件的目标文件夹路径。该函数的实现分为三步:
- 创建目标目录:如果目标目录不存在,则先创建目录。
- 获取txt文件名列表:调用get_txt_file_list函数获取txt文件名列表。
- 遍历txt文件名列表,依次提取txt文件到目标目录:使用ZipFile类读取zip文件中的txt文件内容,然后指定文件名并保存到目标目录中。
在这段代码中,我们使用了os模块来操作目录。我们使用os.path.join函数来连接目录,确保代码在不同操作系统中也能正确运行。同时,由于txt文件的编码可能不同,我们使用”utf-8″编码解码读取的txt文件内容。
完整代码
import os
import zipfile
def get_txt_file_list(zip_file):
"""
获取zip文件中所有的txt文件名
"""
txt_file_list = []
with zipfile.ZipFile(zip_file, 'r') as myzip:
# 获取zip文件中所有文件名
file_names = myzip.namelist()
# 遍历所有文件名,筛选出txt文件
for file_name in file_names:
if file_name.endswith('.txt'):
txt_file_list.append(file_name)
# 返回txt文件名列表
return txt_file_list
def extract_txt_files(zip_file, dest_dir):
"""
提取zip文件中的txt文件到指定目录
"""
# 创建目录
if not os.path.exists(dest_dir):
os.makedirs(dest_dir)
# 获取txt文件名列表
txt_file_list = get_txt_file_list(zip_file)
# 遍历txt文件名列表,依次提取txt文件到目标目录
with zipfile.ZipFile(zip_file, 'r') as myzip:
for file_name in txt_file_list:
# 读取zip文件中的txt文件内容
content = myzip.read(file_name).decode('utf-8')
# 指定文件名并保存到目标目录
file_path = os.path.join(dest_dir, os.path.basename(file_name))
with open(file_path, 'w', encoding='utf-8') as f:
f.write(content)
print(f"已将{zip_file}中所有的txt文件提取到{dest_dir}中")
操作演示
为了验证代码的正确性,我们可以在D盘根目录下新建一个名为”data.zip”的zip文件。data.zip中包含以下文件:
data.zip
|-- data1.txt
|-- data2.txt
|-- data3.csv
|-- data4.xlsx
我们希望从data.zip中提取所有的txt文件到D盘根目录下的test文件夹中。可以使用以下代码:
zip_file = 'D:\test\data.zip'
dest_dir = 'D:\test\extracted_files'
extract_txt_files(zip_file, dest_dir)
代码运行后,我们将在D:\test\extracted_files中得到两个名为data1.txt和data2.txt的文件,它们是从data.zip中提取出来的。
结论
通过Python的zipfile库,我们可以轻松提取zip文件中的指定类型文件。本文中,我们介绍了如何从zip文件中提取所有的txt文件,通过代码实现了zip文件的解压过程。这个解压的过程不仅可以应用在txt文件上,还可以应用在其他类型的文件上。相信在以后的数据处理中,这个技巧一定会帮到你。