如何使用python将制表符限制的文本文件插入sql数据库?

时间:2018-08-09 11:13:24

标签: python sql text-files

with open('employee.txt') as textfile:
    csvreader = csv.reader(textfile, delimiter='\t')
    csvdata = []
    for row in csvreader:
        csvdata.append(row)

conn = pymysql.connect (host = "localhost",user = "root", passwd = "password",db = "details1")
c = conn.cursor()
for row in csvdata:
    c.execute("INSERT INTO employee6(serial_no, first_name, last_name, age, sex,city) VALUES ('%s', '%s', '%s', '%s', '%s','%s')" % (serial_no,first_name,last_name,age,sex,city))

conn.commit()
c.close()`enter code here`

但是我遇到一个错误  在()中       8 c = conn.cursor()       9 for csvdata中的行: ---> 10 c.execute(“ INSERT INTO employee6(序列号,名字,姓氏,年龄,性别,城市)VALUES('%s','%s','%s','%s','% s','%s')“%(序列号,名字,姓氏,年龄,性别,城市)      11      12 conn.commit() NameError:名称“ serial_no”未定义 为什么我会收到此错误

2 个答案:

答案 0 :(得分:1)

应该是:

        c.execute("INSERT INTO employee6(serial_no, first_name, last_name, age, sex,city) VALUES ('%s', '%s', '%s', '%s', '%s','%s')" % (row["serial_no"], row["first_name"], row["last_name"], row["age"],row["sex"],row["city"]))

已编辑

    with open('employee.txt') as textfile:
        csvreader = csv.reader(textfile, delimiter='\t')
        csvdata = []
        conn = pymysql.connect (host = "localhost",user = "root", passwd = "password",db = "details1")
        c = conn.cursor()
        for row in csvreader:
            c.execute("INSERT INTO employee6(serial_no, first_name, last_name, age, sex,city) VALUES ('%s', '%s', '%s', '%s', '%s','%s')" % (row["serial_no"], row["first_name"], row["last_name"], row["age"],row["sex"],row["city"]))


        conn.commit()
        c.close()

答案 1 :(得分:0)

假设读取输入文件可以正常工作,则csvdata变量中将有一个列表列表。

不建议您尝试使用字符串插值来创建SQL查询字符串的方式,这可能很危险。它允许SQL injection attacks,但也可以使字符串格式化以强制使用正确的数据类型,特别是对于INSERT查询而言。

所有兼容DB-API 2的适配器都必须传递sequence of parameters以及适配器将安全替换的查询字符串。

由于row在迭代csvdata时应该已经是列表,因此您的execute调用看起来像这样:

for row in csvdata:
    c.execute("INSERT INTO employee6(serial_no, first_name, last_name, age, sex,city) VALUES (%s, %s, %s, %s, %s,%s)", row)

但是,由于您的csvdata已经是列表列表,因此您也可以使用executemany代替上面的内容:

c.executemany("INSERT INTO employee6(serial_no, first_name, last_name, age, sex,city) VALUES (%s, %s, %s, %s, %s,%s)", csvdata[1:])

注意:csvdata[1:]是要从INSERT中排除标题行。