你是否需要用Python解压文件,保留或不保留文件结构?在这篇短文中,你可以找到几个将单个或多个文件解压到同一文件夹的例子。
第1步:从压缩文件中解压单个文件
首先,让我们有一个名为:archive.zip 的压缩文件。该文件可以从这里获得。证券交易所数据。
它里面有3个csv文件:
- indexProcessed.csv
- indexInfo.csv
- indexData.csv
如果你想从中只提取一个文件--indexProcessed.csv ,那么你可以使用下一个Python片段:
import zipfile
path = '/home/myuser/Downloads/'
archive = zipfile.ZipFile(f'{path}archive.zip')
for file in archive.namelist():
if file.startswith('indexProcessed.csv'):
archive.extract(file, path)
归档文件位于文件夹:/home/myuser/Downloads/ ,目标文件将在同一位置被提取。
这段代码使用了库zipfile 。它读取档案并遍历里面的所有文件。
然后检查文件是否以indexProcessed.csv 开头,如果是,它将把它提取到目标路径。
为了提取多个文件,你可以改变if条件以满足你的需要。
第2步:从压缩文件中解压所有文件
如果你想从一个压缩包中提取所有的文件,该怎么办?我们将再次使用zipfile 。这一次,我们将使用extractall 来代替extract 方法:
import zipfile
path = '/home/myuser/Downloads/'
zipfilepath = f'{path}archive.zip'
extractiondir = f'{path}/extract'
zip = zipfile.ZipFile(zipfilepath)
zip.extractall(path=extractiondir)
同样,档案文件位于/home/myuser/Downloads/ 。输出的文件夹将是/home/myuser/Downloads/extract
注意,这个方法将提取整个结构--所有的文件和文件夹都是递归的:

第3步:解压缩所有文件,但不保留结构
要从一个压缩文件中解压所有的文件而不保留原来的结构,你可以使用模块os ,以改变目标文件夹为:
import zipfile
import os
path = '/home/myuser/Downloads/'
archive = f'{path}/archive.zip'
with zipfile.ZipFile(archive) as zipfile:
for zip_info in zipfile.infolist():
if zip_info.filename[-1] == '/':
continue
zip_info.filename = os.path.basename(zip_info.filename)
zipfile.extract(zip_info, f'{path}/extract')
上面的代码将以递归方式将所有文件解压缩到目标文件夹/home/myuser/Downloads/extract 。
第4步:从压缩文件中解压所有CSV文件
最后让我们看看如何从压缩包中只提取CSV文件。这可以通过CSV扩展名过滤文件来完成。我们将使用方法endswith :
import zipfile
path = '/home/myuser/Downloads/'
archive = zipfile.ZipFile(f'{path}archive.zip')
for file in archive.namelist():
if file.endswith('.csv'):
archive.extract(file, path)