如何将URL返回的CSV响应转换为DataFrame并写入SQL表
问题
我有一项需求:从网站下载CSV格式的数据并写入SQL表。目前已使用以下Python代码实现登录获取token,并获取到了CSV格式的响应内容:
import urllib from bs4 import BeautifulSoup url = "https://abcdef.oz/login" response = opener.open(url) if response.status == 200: #webUrl = urllib.request.urlopen(url) #print("Result code: " + str(webUrl.getcode())) data = response.read().decode("utf-8") soup = BeautifulSoup(data) #Got a token token = soup.find_all("meta", {"name":"token"}, limit=1)[0]['content'] print("token",token) sdata = {"email": "abc@def.com", "password": "password"} data = urllib.parse.urlencode(sdata).encode() print("data",data) url = "https://abcdef.oz.co/reports" response = opener.open(url) r = response.read().decode('utf-8') print(r) else: print("No Response")
响应内容示例如下:
"Col1","Col2","Col3" "abc","def","efg" "hij","klm","mno"
请问如何将该响应转换为可跳过表头、能写入SQL表的格式(如DataFrame)?
解决方案
1. 将CSV响应转为DataFrame
使用pandas结合StringIO处理字符串格式的CSV,直接跳过表头行:
首先导入所需库:
import pandas as pd from io import StringIO
然后处理响应内容r:
# 把CSV字符串包装成文件流对象 csv_stream = StringIO(r) # 跳过第一行表头,读取数据到DataFrame,可自定义列名 df = pd.read_csv(csv_stream, skiprows=1, names=["col1", "col2", "col3"])
如果需要保留原表头作为DataFrame的列名(仅写入SQL时忽略表头逻辑),直接读取即可:
df = pd.read_csv(StringIO(r))
2. 写入SQL表
借助pandas的to_sql方法结合sqlalchemy实现数据写入,步骤如下:
首先导入并创建数据库连接(以MySQL为例,其他数据库连接格式类似):
from sqlalchemy import create_engine # 连接格式:数据库类型+驱动://用户名:密码@主机地址:端口/数据库名 engine = create_engine('mysql+pymysql://your_username:your_password@localhost:3306/your_database')
然后将DataFrame写入SQL表:
# if_exists参数可选'replace'(替换表)、'append'(追加数据)、'fail'(表存在则报错) df.to_sql('target_table', engine, if_exists='append', index=False)
注意:确保DataFrame的列名与目标SQL表的列名对应,若列名不匹配,可通过columns参数指定映射关系。
内容的提问来源于stack exchange,提问作者TalendDeveloper
相关产品推荐
相关产品推荐

