首页 > 编程问答 >python 脚本中的路点用于处理大数据集

python 脚本中的路点用于处理大数据集

时间:2024-07-23 06:53:30浏览次数:7  
标签:python api waypoint

我编写了一个脚本,将一堆来自 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}") 

说明:

  1. 航路点: 该脚本使用 start_index 变量作为航路点来跟踪进度。它会定期获取已处理数据的最后一个索引,确保从中断处继续。
  2. 分批处理: 它通过一次获取 BATCH_SIZE 个条目来处理大型数据集,这可以防止内存过载,并且在中断时提供更精细的恢复点。
  3. CSV 文件: 它使用 CSV 文件 ( data.csv ) 作为持久存储来存储已处理的数据。你可能希望选择一个更适合你的需求的数据库。
  4. 错误处理和重试: 它包含使用 try...except 块的基本错误处理,以捕获网络错误或 API 问题。在重试获取数据之前会暂停一小段时间 ( RETRY_DELAY )。
  5. 继续功能: get_last_processed_index 函数读取 CSV 文件并检索上次成功写入的索引。脚本从此处恢复,确保不会丢失数据,并且不会处理重复条目。

使用方法:

  1. 将占位符值 ( API_ENDPOINT BATCH_SIZE RETRY_DELAY CSV_FILE ) 替换为你的实际值。
  2. 运行脚本。它将开始从 API 获取数据,将其写入 CSV 文件,并定期打印进度。
  3. 如果你需要暂停脚本,请随时停止它。当你再次运行脚本时,它将从上次停止的地方继续。

其他考虑因素:

  • 对于非常大的数据集,你可能希望探索使用数据库来实现更好的性能和数据完整性。
  • 根据你的 API 和数据速率调整 BATCH_SIZE RETRY_DELAY 值以优化性能。
  • 为了实现更强大的错误处理,请考虑实现指数退避或请求限制,以更优雅地处理 API 错误。

标签:python,api,waypoint
From: 78780997

相关文章

  • Python 中的 SSL 模块不可用(在 OSX 上)
    我在OSX10.13上的virtualenv中运行时遇到问题。我已经运行了pipinstall并且路径brewinstallopenssl指向/usr/local/include/openssl有谁知道如何解决这一问题?在我重新安装../opt/openssl/include/openssl使用python后,这种......
  • AWS Elastic Beanstalk chown PythonPath 错误
    我正在AWS的elasticbeanstalk上部署一个Web应用程序,遇到了同样的错误:[StageApplication].Stoprunningthecommand.Error:chown/var/app/staging/venv/bin/python:nosuchfileordirectory.我在我的环境配置中看到属性:PYTHONPATH:/var/......
  • Python:支持索引的内存对象数据库?
    我正在做一些数据整理,如果我可以将一堆字典放入内存数据库中,然后对其运行简单的查询,这会简单得多。例如,类似:people=db([{"name":"Joe","age":16},{"name":"Jane","favourite_color":"red"},])over_16=db.filter(age__g......
  • RapidAPI 在浏览器测试中工作,但在我的 IDE 中不工作
    我对API没有太多经验,所以这个问题的答案对某些人来说可能是显而易见的。我在一个项目中使用RapidAPI的SkyscannerAPI,每当我在RapidAPIAPI游乐场中测试端点时,它似乎工作得很好。但是,当我将代码(不进行任何更改)复制到IDE时,它会抛出一堆错误,特别是“证书验证失败”错误。......
  • 如何构建一维数组的二维数组的特定 Python 结构?
    如何构建一维数组(即行向量)的二维数组的特定结构以满足特定我正在维护的遗留程序的结构?我可以在此结构中生成正确的内容all_measurements[:12]array([[0.,0.,0.,2.],[0.02,0.334,0.04,2.24],[0.04,0.668,0.08,2.48],...........
  • 如何使用 Python Flask 将新的咖啡馆(元素)添加到数据库(SQLite)?
    这是我的代码:@app.route("/add",methods=["POST"])defpost_new_cafe():new_cafe=Cafe(name=request.form.get("name"),map_url=request.form.get("map_url"),img_url=request.form.get("img......
  • 使用 tkinter 为 python 创建 GUI 时如何解决语法错误?
    我是一名Python初学者,决定使用tkinter制作一个小型GUI,该GUI接受用户(潜在餐馆)的3个输入,然后单击按钮后随机输出其中一家餐馆。我不断收到语法错误,并认为它与我的buttonfunc或调用它的命令有关。此代码尚未包含在GUI上输出餐厅的任何位置。任何帮助将不胜感激#Pyth......
  • 在 python 中打开 gnome 终端立即显示为僵尸
    作为背景,我正在编写一个脚本来训练多个pytorch模型。我有一个训练脚本,我希望能够在gnome终端中作为子进程运行。这样做的主要原因是我可以随时关注训练进度。如果我可能有多个GPU,我想在单独的窗口中多次运行我的训练脚本。为了实现这一点,我一直在使用popen。以下代码用于打......
  • python threading.Condition 的意外行为
    我正在尝试同步多个线程。我期望使用threading.Condition和threading.Barrier时的脚本输出大致相同,但事实并非如此。请解释一下为什么会发生这种情况。一般来说,我需要线程在一个无限循环中执行工作(一些IO操作),但是每个循环都是以主线程的权限开始的,而权限是仅在......
  • Python - 逆透视数据框
    我有一个按日期时间索引的表,每个日期时间都有多个层(中心和交货间隔):日期时间中心交货间隔结算点价格2024-01-0101:00:00休斯顿中心1......