import zipfile import pandas as pd # 直接从zip文件中读取CSV,无需解压 zip_path = 'data.zip' with zipfile.ZipFile(zip_path, 'r') as zip_file: df = pd.read_csv(zip_file.open('database.csv')) print(df.head())
方法一:使用pandas直接读取zip内文件
大家好,我是数据分析小熊。今天分享一个超级实用的技巧:在Python中直接从ZIP压缩包读取数据库文件,不用解压就能加载数据,大大节省时间和空间! 传统方式:下载ZIP -> 解压到本地 -> 用pandas.read_csv加载 -> 处理完删除临时文件(麻烦!) 新方式:一行代码直接读!
完整代码示例
import pandas as pd import zipfile # 方法1:单个CSV文件 def read_csv_from_zip(zip_path, csv_filename): with zipfile.ZipFile(zip_path, 'r') as z: with z.open(csv_filename) as f: return pd.read_csv(f) df = read_csv_from_zip('big_database.zip', 'data.csv') print(f"数据形状:{df.shape}") # 方法2:ZIP内有多个CSV,按需读取 df1 = read_csv_from_zip('data.zip', 'users.csv') df2 = read_csv_from_zip('data.zip', 'orders.csv')
方法二:处理SQLite数据库ZIP包
如果你的数据库是SQLite文件压缩在ZIP中: import sqlite3 import zipfile from io import BytesIO zip_path = 'database.zip' with zipfile.ZipFile(zip_path, 'r') as zip_file: # 读取SQLite文件到内存 sqlite_data = zip_file.read('app.db') conn = sqlite3.connect(':memory:') conn.executescript(sqlite_data.decode()) # 查询数据 df = pd.read_sql_query("SELECT * FROM users LIMIT 10", conn) print(df)
大数据量优化技巧
# 内存不够用?分块读取 for chunk in pd.read_csv(zip_file.open('bigfile.csv'), chunksize=10000): # 处理每个chunk process(chunk) # 或者用Dask处理超大文件 import dask.dataframe as dd df = dd.read_csv('data.zip') # 自动支持ZIP!
实际项目应用场景
1. Kaggle比赛:数据集动辄GB级,直接读ZIP节省80%时间 2. 爬虫数据:每天生成ZIP包,直接分析不占盘 3. 服务器部署:数据预压缩,加载速度翻倍 4. 移动端数据:APK内嵌ZIP数据库,即开即用
其他格式支持
# Excel文件 pd.read_excel(zip_file.open('data.xlsx')) # Parquet(推荐大数据) pd.read_parquet(zip_file.open('data.parquet')) # JSON pd.read_json(zip_file.open('data.json'))
FAQ
Q: ZIP文件密码保护怎么办?
A: 用zipfile.ZipFile(zip_path, 'r')时传入pwd='密码'
Q: 读取失败显示编码错误?
A: pd.read_csv(..., encoding='gbk' 或 'utf-8')指定编码
Q: ZIP内嵌套文件夹怎么读?
A: zip_file.namelist()列出所有文件路径,完整路径读取
Q: 有多层ZIP压缩?
A: 递归解压到内存:zip_file.read(嵌套zip路径),再用ZipFile(BytesIO())处理