Python如何将CSV文件内容传入data字典并解决JSON序列化错误
解决方法
先梳理你代码里的几个核心问题,再给出修正后的方案:
问题分析
- 变量名不匹配:函数参数是
csv,但代码里用了未定义的csv_file_path,会触发NameError - 字节无法JSON序列化:
rb模式读取的是bytes类型,JSON只能序列化字符串/数字等基础类型 - 字典语法错误:键值对之间缺少逗号,会直接触发语法异常
- 请求方式冗余:手动调用
json.dumps后用data参数,不如直接用requests的json参数自动处理序列化
方案1:直接读取文本内容(适用于接口接受纯文本CSV)
如果API期望接收的是CSV的文本内容,用文本模式读取即可:
import requests api_url = 'test.com/sample_api' csv_file_path = '/home/user/Desktop/folder/folder2/csv/file.csv' def post_request(api_url, csv_file_path): # 用文本模式读取,注意编码匹配你的CSV文件(比如utf-8/gbk) with open(csv_file_path, 'r', encoding='utf-8') as file: csv_content = file.read() # 修复字典逗号问题,filename可以只保留文件名而非全路径 data = { "id": "1", "name": "test", "data_file": [ {"filename": csv_file_path.split('/')[-1], "file": csv_content} ] } print(data) # 此时file字段是CSV实际内容 # 用json参数自动处理序列化和Content-Type response = requests.post(api_url, json=data) print(response.text) # 调用函数 post_request(api_url, csv_file_path)
方案2:Base64编码二进制内容(适用于接口要求二进制传输)
如果API需要接收二进制文件的序列化内容,Base64是通用解决方案:
import requests import base64 api_url = 'test.com/sample_api' csv_file_path = '/home/user/Desktop/folder/folder2/csv/file.csv' def post_request(api_url, csv_file_path): with open(csv_file_path, 'rb') as file: csv_content = file.read() # 将字节转成Base64字符串,可被JSON序列化 csv_base64 = base64.b64encode(csv_content).decode('utf-8') data = { "id": "1", "name": "test", "data_file": [ {"filename": csv_file_path.split('/')[-1], "file": csv_base64} ] } response = requests.post(api_url, json=data) print(response.text)
关键注意点
- 务必匹配CSV文件的实际编码(比如中文CSV可能用
gbk),否则会出现乱码 - 字典的每个键值对末尾必须加逗号,Python允许尾逗号,避免语法错误
- 优先使用
requests.post的json参数,无需手动设置Content-Type和调用json.dumps
内容的提问来源于stack exchange,提问作者UDOT
相关产品推荐
相关产品推荐

