使用Python将CSV数据转换为两个MYSQL表

2024-10-02 02:28:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要从csv文件中获取数据并将其导入到同一数据库中的两个mysql表中。在

CSV文件:

username,password,path
FP_Baby,7tO0Oj/QjRSSs16,FP_Baby
lukebryan,uu00U62SKhO.sgE,lukebryan
saul,r320QdyLJEXKEsQ,saul
jencarlos,LOO07D5ZxpyzMAg,jencarlos
abepark,HUo0/XGUeJ28jaA,abepark

从CSV文件

usernamepassword进入USERS表 path进入VFS\u权限表

USERS表看起来像

^{pr2}$

如果可能的话,我希望在两个表中以24开始userid,并为csv中的每一行递增+1。在

到目前为止,我可以阅读csv文件,但我不知道如何插入到两个mysql表中。在

#!/usr/bin/env python
import csv
import sys
import MySQLdb
conn = MySQLdb.connect(host= "localhost",
                  user="crushlb",
                  passwd="password",
                  db="crushlb")

x = conn.cursor()

f = open(sys.argv[1], 'rt')
try:
    reader = csv.reader(f)
    for row in reader:

    ## mysql stuff goes here right?

finally:
    f.close()

Tags: 文件csvpathimportmysqlusernamepasswordreader
2条回答

由于您已经知道要执行的sql语句,因此使用cursor.execute方法应该比较简单:

offset = 23
for row_number, row in enumerate(reader):
    username, password, path = row
    x.execute("INSERT INTO `USERS` (`userid`, `username`, `password`, `server_group`) "
              "VALUES (%s, %s, %s, 'MainUsers')", (row_number+offset, username, password))
    x.execute("INSERT INTO `VFS_PERMISSIONS` (`userid`, `path`, `privs`) "
              "VALUES (%s, %s, '(read)(write)(view)(delete)(resume)(share)(slideshow)(rename)(makedir)(deletedir)'", (row_number+offset, path))

通过提前(在循环中)准备参数并在循环完成后调用cursor.executemany,可以减少对cursor.execute的调用次数:

cursor = conn.cursor()   
user_args = []
perm_args = []

perms = '(read)(write)(view)(delete)(resume)(share)(slideshow)(rename)(makedir)(deletedir)'

with open(sys.argv[1], 'rt') as f:
    for id, row in enumerate(csv.reader(f), start = 24):
        username, password, path = row
        user_args.append((id, username, password, 'MainUsers'))
        perm_args.append((id, path, perms))

insert_users = '''
    INSERT IGNORE INTO `USERS`
    (`userid`, `username`, `password`, `server_group`)
    VALUES (%s, %s, %s, %s)
    '''

insert_vfs_permissions = '''
    INSERT IGNORE INTO `VFS_PERMISSIONS`
    (`userid`, `path`, `privs`)
    VALUES (%s, %s, %s)
    '''

cursor.executemany(insert_users,user_args)
cursor.executemany(insert_vfs_permissions,perm_args)

INSERT IGNORE告诉MySQL尝试在MySQL表中插入行,但是如果存在冲突,则忽略该命令。例如,如果userid是主键,并且已经有一行具有相同的userid,INSERT IGNORESQL将忽略插入新行的命令,因为这将创建两个具有相同主键的行。在

如果没有IGNOREcursor.executemany命令将引发异常并无法插入任何行。在

我使用了INSERT IGNORE,因此您可以多次运行代码,而不会cursor.executemany引发异常。在

还有一个INSERT ... ON DUPLICATE KEY UPDATE命令,它告诉MySQL尝试插入一个行,但是如果有冲突,就更新它,但是除非您想了解更多关于ON DUPLICATE KEY的信息,否则我就不谈了。在

相关问题 更多 >

    热门问题