我编写了一个脚本,将一堆来自 api 的请求写入 csv 文件。该 api 中有数千个请求,并且在结束循环/退出程序之前永远不会结束。如何合并航路点,以便如果再次发生停顿,它会自动继续前进并最终打印所有请求?
我尝试了一些不起作用的方法,但我不知道下一步该怎么做。
以下是使用航路点处理 Python 脚本中大型数据集的有效方法,以实现可靠的继续功能:
import requests
import csv
import time
API_ENDPOINT = 'https://api.example.com/data' # 将其替换为你的 API 端点
BATCH_SIZE = 100 # 一次处理的请求数
RETRY_DELAY = 10 # 发生错误时的重试秒数
CSV_FILE = 'data.csv' # 输出 CSV 文件
def fetch_data(start_index):
"""从 API 获取一批数据。"""
try:
response = requests.get(API_ENDPOINT, params={'start': start_index, 'limit': BATCH_SIZE})
response.raise_for_status() # 如果请求失败,则引发异常
return response.json()
except requests.exceptions.RequestException as e:
print(f"获取数据时出错:{e}")
time.sleep(RETRY_DELAY) # 发生错误时重试之前等待
return fetch_data(start_index) # 重试获取数据
def write_data_to_csv(data, csv_writer):
"""将数据写入 CSV 文件。"""
for item in data:
csv_writer.writerow(item.values()) # 根据你的数据结构调整
def get_last_processed_index(csv_file):
"""从 CSV 文件中获取上次处理过的索引。"""
try:
with open(csv_file, 'r') as f:
reader = csv.reader(f)
last_row = list(reader)[-1] # 获取最后一行
if last_row:
return int(last_row[0]) # 假设索引位于第一列
except FileNotFoundError:
return 0 # 如果文件不存在,则从 0 开始
if __name__ == "__main__":
start_index = get_last_processed_index(CSV_FILE)
with open(CSV_FILE, 'a', newline='') as f:
writer = csv.writer(f)
if start_index == 0:
# 如果是新文件,请写入标题
writer.writerow(['column1', 'column2', ...]) # 用你的列名替换
while True:
data = fetch_data(start_index)
if not data:
break # 如果没有更多数据,则退出循环
write_data_to_csv(data, writer)
start_index += BATCH_SIZE
print(f"已处理到索引:{start_index}")
说明:
-
航路点:
该脚本使用
start_index
变量作为航路点来跟踪进度。它会定期获取已处理数据的最后一个索引,确保从中断处继续。 -
分批处理:
它通过一次获取
BATCH_SIZE
个条目来处理大型数据集,这可以防止内存过载,并且在中断时提供更精细的恢复点。 -
CSV 文件:
它使用 CSV 文件 (
data.csv
) 作为持久存储来存储已处理的数据。你可能希望选择一个更适合你的需求的数据库。 -
错误处理和重试:
它包含使用
try...except
块的基本错误处理,以捕获网络错误或 API 问题。在重试获取数据之前会暂停一小段时间 (RETRY_DELAY
)。 -
继续功能:
get_last_processed_index
函数读取 CSV 文件并检索上次成功写入的索引。脚本从此处恢复,确保不会丢失数据,并且不会处理重复条目。
使用方法:
-
将占位符值 (
API_ENDPOINT
、BATCH_SIZE
、RETRY_DELAY
、CSV_FILE
) 替换为你的实际值。 - 运行脚本。它将开始从 API 获取数据,将其写入 CSV 文件,并定期打印进度。
- 如果你需要暂停脚本,请随时停止它。当你再次运行脚本时,它将从上次停止的地方继续。
其他考虑因素:
- 对于非常大的数据集,你可能希望探索使用数据库来实现更好的性能和数据完整性。
-
根据你的 API 和数据速率调整
BATCH_SIZE
和RETRY_DELAY
值以优化性能。 - 为了实现更强大的错误处理,请考虑实现指数退避或请求限制,以更优雅地处理 API 错误。