如何使用Python将CSV天气数据导入SQLite3数据库表
解决方案:将CSV天气数据插入SQLite数据库
刚好我之前做过类似的需求,结合你给出的表结构和已有条件,直接用pandas的to_sql方法就能高效完成数据插入,不用手动写循环拼接SQL语句,既简洁又不容易出错。下面是完整的实现代码和关键细节解释:
完整代码示例
import pandas as pd import sqlite3 # 读取CSV文件,只加载需要的三个字段 weather_df = pd.read_csv('your_weather_data.csv', usecols=['date', 'temperaturemin', 'temperaturemax']) # 重命名列名,和SQLite表的字段名完全匹配(避免字段映射错误) weather_df.rename(columns={ 'date': 'Date', 'temperaturemin': 'TemperatureMin', 'temperaturemax': 'TemperatureMax' }, inplace=True) # 连接到目标SQLite数据库 db_conn = sqlite3.connect('rduDB.db') try: # 将DataFrame数据批量插入到rduWeather表 weather_df.to_sql( name='rduWeather', con=db_conn, if_exists='append', # 追加模式,不会覆盖已有数据 index=False, # 不把DataFrame的索引作为表的id字段(表的id是自增主键) dtype={ 'Date': 'VARCHAR(256)', 'TemperatureMin': 'TEXT', 'TemperatureMax': 'TEXT' } ) print("CSV数据成功插入到rduWeather表!") except Exception as insert_error: print(f"插入过程遇到问题: {insert_error}") finally: # 无论成功失败,都要关闭数据库连接 db_conn.close()
关键细节解释
我把几个容易踩坑的点单独拎出来说:
- 精准读取CSV字段:用
usecols参数只加载需要的date、temperaturemin、temperaturemax三个字段,既节省内存,也避免后续处理无关数据的麻烦。 - 列名严格匹配:你的SQLite表字段是大写开头的(比如
Date),而CSV里是小写,所以必须重命名列名,否则pandas会因为字段名不匹配而报错。 to_sql参数的核心作用:if_exists='append':这是最关键的参数!如果你的表已经有历史数据,这个参数会把新的CSV数据追加到表末尾;如果是第一次插入,也能正常适配已有的表结构。要是不小心写成replace,会直接清空表重新插入,千万注意!index=False:因为你的表已经有自增的id主键,不需要把DataFrame的索引当成id,所以必须禁用这个选项,数据库会自动为每条插入的数据生成唯一的id值。dtype:显式指定每个字段的类型,和你创建表时的CREATE TABLE语句保持一致,避免pandas自动推断类型导致的兼容性问题(比如把温度数值自动转成整数类型,而表要求是TEXT)。
- 异常处理与连接关闭:用
try...finally确保无论插入成功还是失败,数据库连接都会被关闭,防止资源泄漏。
额外注意事项
- 如果CSV里的日期格式和你预期的不一致(比如是
MM/DD/YYYY而不是YYYY-MM-DD),可以用pandas先转换格式:weather_df['Date'] = pd.to_datetime(weather_df['Date']).dt.strftime('%Y-%m-%d') - 要是你后续想把温度字段改成数值类型(比如
REAL),只需要修改表结构和dtype参数即可,当前代码是完全按照你给出的表结构来写的。
内容的提问来源于stack exchange,提问作者Pyt Leb
相关产品推荐
相关产品推荐

