Python使用requests下载GTFS数据后如何提取内部txt文件
GTFS数据下载与提取实现方案
你请求到的返回内容是标准的ZIP格式压缩包,GTFS公开数据集普遍以zip格式打包分发,里面包含stops.txt、routes.txt等子文件。你当前的代码只是直接将压缩包的二进制内容写入了无后缀文件,没有经过解压步骤,因此无法直接访问内部的子文件。
所需依赖
仅需Python标准库即可实现,无需额外安装第三方包:
zipfile:用于解压/解析ZIP格式文件os:用于本地目录创建校验io(可选):用于内存流处理,无需先存zip文件到本地
具体实现代码
方案1:先保存压缩包到本地,再解压提取所有文件
适合需要留存原始GTFS压缩包的场景:
import requests import zipfile import os def download_gtfs(url): # 提前定义存储路径、创建目录避免运行报错 zip_save_path = "prov/city/gtfs_raw.zip" extract_dir = "prov/city/GTFS" os.makedirs(extract_dir, exist_ok=True) r = requests.get(url, timeout=30) if r.ok: # 先保存压缩包到本地 with open(zip_save_path, "wb") as f: f.write(r.content) print("压缩包下载完成,开始解压") # 解压所有文件到指定目录 with zipfile.ZipFile(zip_save_path, "r") as zip_ref: zip_ref.extractall(extract_dir) print(f"所有文件已解压到{extract_dir},可直接访问该目录下的stops.txt等文件") else: print(f"下载失败,状态码:{r.status_code}") # 调用示例 download_gtfs("https://transitfeeds.com/p/agence-metropolitaine-de-transport/129/latest/download")
方案2:内存直接解析压缩包,无需保存原始zip文件
适合不需要留存原始压缩包,仅需提取子文件的场景,节省存储空间:
import requests import zipfile import io import os def download_gtfs(url): extract_dir = "prov/city/GTFS" os.makedirs(extract_dir, exist_ok=True) r = requests.get(url, timeout=30) if r.ok: print("下载完成,开始解析压缩包") # 直接用BytesIO把返回内容转成可被zipfile读取的流对象 with zipfile.ZipFile(io.BytesIO(r.content)) as zip_ref: # 可以选择直接全部解压到本地 zip_ref.extractall(extract_dir) # 也可以只读取特定文件内容,无需存本地直接操作 # with zip_ref.open("stops.txt") as f: # stops_content = f.read() # # 直接对stops_content做数据处理 print(f"文件提取完成,存储目录:{extract_dir}") else: print(f"下载失败,状态码:{r.status_code}")
后续操作
解压完成后你可以直接在指定的extract_dir目录下找到所有GTFS标准文件,用普通文件读写操作即可读取stops.txt等内容做后续处理。
内容的提问来源于stack exchange,提问作者k3t0
相关产品推荐
相关产品推荐

