Python解析CSV的Full_name列并插入SQL数据库遇无输出问题求助
解决Python解析CSV姓名并插入SQL数据库的问题
首先,你的代码里有几个关键问题导致没有输出且功能失效,我逐一给你拆解:
- 缺少sys模块导入:代码里用到了
sys.argv和sys.exit(),但没有开头导入import sys,这会直接触发报错 - 错误的嵌套循环:外层已经用
for row in reader遍历CSV行,内层又写了for name in reader,这会把CSV读取器的指针直接移到文件末尾,外层循环根本不会执行 - 姓名拆分逻辑错误:你直接用
len(name)判断的是字符串长度,不是单词数量;而且没有用split()方法拆分姓名成单词列表,name[0]取的是字符串第一个字符,不是第一个名字 - print语法错误:Python里不能用
print(first_name = name[0])这种赋值式打印,应该先赋值变量再打印,或者用格式化字符串 - 数据库操作位置错误:
db.execute()放在了循环外面,而且没有定义数据库连接、没有提交事务,也用错了变量(row["first_name"]不存在,应该用拆分后的变量)
修正后的完整代码
import csv import sys # 这里以sqlite3为例,如果你用MySQL/PostgreSQL等,替换对应数据库的导入和连接代码 import sqlite3 if __name__ == '__main__': if len(sys.argv) != 2: print("Please enter the csv file too: python name_parsing.py student_info.csv") sys.exit() # 初始化数据库连接 conn = sqlite3.connect('student_names.db') db = conn.cursor() # 提前创建表(如果还不存在的话) db.execute('''CREATE TABLE IF NOT EXISTS name (first TEXT, middle TEXT, last TEXT)''') with open(sys.argv[1], "r") as file: reader = csv.DictReader(file) for row in reader: full_name = row["Full_name"].strip() # 去除姓名前后的空格 name_parts = full_name.split() # 按空格拆分姓名为单词列表 first_name = None middle_name = None last_name = None if len(name_parts) == 2: first_name = name_parts[0] last_name = name_parts[1] print(f"拆分结果: First={first_name}, Middle={middle_name}, Last={last_name}") elif len(name_parts) == 3: first_name = name_parts[0] middle_name = name_parts[1] last_name = name_parts[2] print(f"拆分结果: First={first_name}, Middle={middle_name}, Last={last_name}") else: # 处理姓名不是2或3个词的情况,可选跳过或记录警告 print(f"警告: 姓名「{full_name}」不符合2/3词格式,跳过该行") continue # 插入数据库 db.execute("INSERT INTO name (first, middle, last) VALUES(?,?,?)", (first_name, middle_name, last_name)) # 提交事务并关闭连接,确保数据写入数据库 conn.commit() conn.close() print("所有有效数据已成功插入数据库!")
额外说明
- 如果你的数据库不是SQLite,比如MySQL,需要替换成对应的连接方式(比如使用
mysql-connector-python库) - 增加了
strip()处理姓名前后空格,避免拆分出空字符串 - 补充了非标准格式姓名的处理逻辑,防止程序崩溃
- 数据库操作必须放在循环内,每处理一行就插入一行,最后一定要执行
conn.commit(),否则数据不会真正写入数据库
内容的提问来源于stack exchange,提问作者speedy_catch
相关产品推荐
相关产品推荐

