Python拼接URL与CSV数据时的格式错误及迭代异常问题求助
Python拼接URL与CSV数据时的格式错误及迭代异常问题求助
看起来你已经走了大部分流程啦,遇到的两个问题其实都是很常见的pandas数据处理小坑,咱们一步步来解决:
问题1:Token ID末尾出现.0导致URL格式错误
你看到的34.0是因为pandas读取CSV时,把token_id列识别成了浮点数类型(大概率是你的CSV里这一列存在空值,或者混合了数字与空值格式,pandas自动将其转为了float类型)。拼接字符串时浮点数会默认带上.0,这肯定会导致API请求返回错误。
解决方法有两种:
- 方法一:读取CSV时直接指定列类型
修改pd.read_csv代码,给token_id指定整数或字符串类型,从源头避免类型问题:df = pd.read_csv( '~/Documents/top_10_nft.csv', usecols=['chain','contract_address' ,'token_id'], delimiter=',', dtype={'token_id': int} # 如果token_id包含非整数字符,就改用str类型 ) - 方法二:在循环内临时转换类型
如果你不想修改读取逻辑,可以在循环里把token_id转成整数再转字符串:
注意:如果token_id = str(int(row['token_id']))token_id存在空值,这行代码会报错,所以一定要先处理空值。
问题2:疑似只处理最后一行/跳过前面行
你提到打印的是最后一行的URL,且怀疑跳过了前面的行,这大概率是因为你调用df.dropna(subset=['chain','contract_address' ,'token_id'])时没有把结果赋值回原DataFrame!pandas的大多数方法都是返回新的DataFrame,不会直接修改原数据,所以原来的df还是包含空值的行,循环时这些空值行拼接出的无效URL可能被你忽略,只注意到了最后一行正常的结果。
修改这行代码,确保后续循环使用清理后的数据集:
# 把dropna的结果赋值给df,替换原数据 df = df.dropna(subset=['chain','contract_address' ,'token_id'])
另外,你在循环外定义的contract_address、chain、token_id变量其实是冗余的,循环内已经重新赋值,可以直接删掉。
额外优化建议
- 简化循环内的代码,不用单独赋值三个变量,直接用row的值拼接:
url = f"https://api.opensea.io/v2/chain/{row['chain']}/contract/{row['contract_address']}/nfts/{str(int(row['token_id']))}" - 增加异常处理,避免请求失败时程序直接崩溃:
try: response = requests.get(url, headers=headers) response.raise_for_status() # 主动触发HTTP错误的异常 data.append(response.json()) except requests.exceptions.RequestException as e: print(f"请求URL {url} 失败: {e}") - 最后将收集到的JSON数据保存为CSV时,可以用
pd.json_normalize扁平化JSON,再保存:result_df = pd.json_normalize(data) result_df.to_csv('nft_response.csv', index=False)
调整后应该就能正常遍历所有有效行,拼接出正确的URL,并且顺利把API返回的JSON数据保存成CSV啦。
备注:内容来源于stack exchange,提问作者Zer0chance_
相关产品推荐
相关产品推荐

