Python读取CSV逐行POST至Django REST API仅上传最后一行问题
解决CSV数据仅最后一行上传至Django REST API的问题
你的核心问题是POST请求代码放在了for循环外部:当循环遍历完所有行后,row变量只会保留最后一行的数据,自然只有这一行被上传。
同时原代码里的状态码判断逻辑存在错误:response.status_code == 200 or 201会被Python解析为(response.status_code ==200) or 201,由于201是布尔真值,不管实际状态码是什么,都会执行"Data inserted successfully"的输出,需要修正为判断状态码是否在成功范围内。
修改后的代码如下:
import requests import os import csv def insert_data_to_api(): # CSV file path csv_folder = "csv" csv_file_name = "my_data.csv" csv_file_path = os.path.join(csv_folder, csv_file_name) url = "http://127.0.0.1:8000/api/url/" with open(csv_file_path, newline='') as file: # create a CSV reader object using DictReader reader = csv.DictReader(file) print("") print("==== UPLOADING ROWS =====") print("") # iterate over each row in the CSV file for row in reader: print(f"Uploading row: {row}") # 将POST请求移到循环内部,每一行数据单独发送 response = requests.post(url, json=row) # 修正状态码判断逻辑 if response.status_code in (200, 201): print(f"Row uploaded successfully") else: print(f"Failed to upload row: {response.status_code}, Response: {response.text}") insert_data_to_api()
额外优化建议
- 如果CSV数据量很大,频繁的POST请求会影响效率,可以考虑修改Django API支持批量上传,将多行数据打包成一个请求发送,减少HTTP请求次数。
- 可以添加异常捕获逻辑,处理网络请求失败的情况(比如连接超时、API不可达等)。
内容的提问来源于stack exchange,提问作者UDOT
相关产品推荐
相关产品推荐

