
在通过url下载文件时,一个常见的误区是直接根据url或预期文件扩展名来判断文件类型。例如,当期望下载一个csv文件时,可能会直接尝试将其保存为.csv并使用pandas.read_csv加载。然而,如果服务器实际返回的是一个压缩文件(如zip),即使下载成功,文件内容也会是损坏的,因为其内部结构并非预期的纯文本或二进制数据。
问题的核心在于,网络上的资源不总是以其最终形式直接提供。有时,为了传输效率或组织结构,文件会被打包成压缩档案。因此,在下载之前,确认资源的真实内容类型至关重要。这通常可以通过检查HTTP响应头(如Content-Type)或通过分析源网页的HTML结构来确定。
当确认目标文件实际上位于一个ZIP压缩包内时,正确的下载和处理流程包括以下几个步骤:
下面是一个具体的Python代码示例,展示了如何实现这一过程:
import requests
import zipfile
import tempfile
import os
import pandas as pd
# 示例URL,指向一个包含CSV文件的ZIP档案
# 实际应用中,请替换为你的目标URL
URL = "https://prod-dcd-datasets-cache-zipfiles.s3.eu-west-1.amazonaws.com/mpjzbtfgfr-1.zip"
# 定义分块下载的缓冲区大小,有助于处理大文件
CHUNK_SIZE = 32 * 1024 # 32 KB
def download_and_extract_zip(url, target_file_extension=".csv", extract_path="."):
"""
从URL下载ZIP文件,解压并返回指定扩展名的文件路径列表。
Args:
url (str): ZIP文件的下载URL。
target_file_extension (str): 目标文件的扩展名,例如 ".csv"。
extract_path (str): 文件解压的目标目录。
Returns:
list: 解压后匹配目标扩展名的文件路径列表,如果失败则返回空列表。
"""
try:
# 使用requests以流模式下载ZIP文件
with requests.get(url, stream=True) as response:
response.raise_for_status() # 检查HTTP请求是否成功
# 使用tempfile创建临时文件来存储下载的ZIP内容
with tempfile.TemporaryFile() as temp_zip_file:
# 分块写入下载内容到临时文件
for chunk in response.iter_content(chunk_size=CHUNK_SIZE):
if chunk: # 过滤掉保持连接的新块
temp_zip_file.write(chunk)
temp_zip_file.flush() # 确保所有数据都已写入磁盘
# 使用zipfile库处理临时文件
with zipfile.ZipFile(temp_zip_file) as zip_archive:
print(f"正在解压文件:{zip_archive.namelist()}")
# 解压所有文件到指定路径
zip_archive.extractall(path=extract_path)
print(f"文件已解压到:{os.path.abspath(extract_path)}")
extracted_files = []
# 查找并返回特定扩展名的文件路径
for filename in zip_archive.namelist():
if filename.endswith(target_file_extension):
extracted_files.append(os.path.join(extract_path, filename))
return extracted_files
except requests.exceptions.RequestException as e:
print(f"下载或网络错误: {e}")
except zipfile.BadZipFile as e:
print(f"ZIP文件损坏或格式不正确: {e}")
except Exception as e:
print(f"发生未知错误: {e}")
return []
# 执行下载和解压
if __name__ == "__main__":
downloaded_csv_files = download_and_extract_zip(URL, ".csv")
if downloaded_csv_files:
print("\n成功提取的CSV文件:")
for csv_file_path in downloaded_csv_files:
print(f"- {csv_file_path}")
try:
# 示例:使用pandas读取解压后的CSV文件
df = pd.read_csv(csv_file_path)
print(f"文件 '{os.path.basename(csv_file_path)}' 加载成功,前5行数据:")
print(df.head())
except Exception as e:
print(f"读取CSV文件 '{csv_file_path}' 时发生错误: {e}")
else:
print("未找到或无法提取目标CSV文件。")
从URL下载文件时,务必首先确认资源的实际格式。当遇到被压缩的资源时,例如ZIP文件,应采用分步处理的方法:先下载整个压缩包,然后利用相应的库(如zipfile)进行解压。通过结合requests进行高效下载、tempfile进行安全临时存储以及zipfile进行档案管理,可以构建出健壮且专业的Python文件下载解决方案。始终牢记错误处理和资源管理,以确保代码的稳定性和可靠性。
立即学习“Python免费学习笔记(深入)”;
以上就是Python高效下载与解压网络文件:以ZIP档案为例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号