使用 Python 将特定列数据从 CSV 导入不同的 MYSQL 表

Posted

技术标签:

【中文标题】使用 Python 将特定列数据从 CSV 导入不同的 MYSQL 表【英文标题】:Import Specific Column Data into Different MYSQL Tables from CSV using Python 【发布时间】:2013-05-22 12:37:11 【问题描述】:

我有一个包含许多列的 csv 文件,我想将两个导入一个表,十个导入另一个,十个导入另一个。我怎样才能修改下面的代码以使其具有选择性?我正在考虑使用 if/elif 语句通过第一行数据来识别列,但我不确定这是最好/最简单的解决方案。

import csv
import mysqldb
# open the connection to the MySQL server.
# using MySQLdb
mydb = MySQLdb.connect(host='hostinfo',
    user='myusername',
    passwd='mypw',
    db='mydatabase')
cursor = mydb.cursor()
# read the presidents.csv file using the python
# csv module http://docs.python.org/library/csv.html
csv_data = csv.reader(file('CHN.csv'))
# execute the for clicle and insert the csv into the
# database.
for row in csv_data:

    cursor.execute('''INSERT INTO INDICATORS (INDICATORNAME, INDICATORCODE)
                  VALUES (%s, %s)''', row)
#close the connection to the database.
mydb.commit()
cursor.close()
print "Import to MySQL is over"

【问题讨论】:

所以你想将元素 0 和 1 导入到 table1,2 到 11 到 table2,12 到 12 到 table3?或者是否有任何变化?第一行数据有什么特别之处?你有例子吗? 我是新手,所以感谢您的帮助和耐心。我有一个超过 50 列的 csv。我想将前两列拉到一个名为 Indicators 的 MySQL 表中。我想将接下来的 10 列拉到另一个名为 Sixties 的表中。我不知道该怎么做。 这里是第一行数据的示例(但不是所有列,因为它到 2012 年): 指标名称 指标代码 1960 1961 1962 1963 1964 1965 1966 1967 1968 【参考方案1】:

首先定义你的 SQL 字符串:

insert_indicators = '''INSERT INTO INDICATORS (INDICATORNAME, INDICATORCODE)
                       VALUES (%s, %s)'''
insert_sixties = 'INSERT INTO Sixties (...) VALUES (%s)' % (','.join(['%s']*10))
insert_seventies = 'INSERT INTO Seventies (...) VALUES (%s)' % (','.join(['%s']*10))

然后像这样在for-loop 中使用它们:

for row in csv_data:
    cursor.execute(insert_indicators, row[:2])
    cursor.execute(insert_sixties, row[2:12])
    cursor.execute(insert_seventies, row[12:22])

请注意,让两个不同的表具有基本相同的结构可能是个坏主意。与其拥有一个Sixties 表和(可能)一个Seventies 表,不如拥有一个具有Decade 列的表可能更好,该列可以容纳enumerated values,例如'Sixties''Seventies'

通过将所有数据放在一个表中,您将能够更轻松地表达某些类型的查询(不必多次重复基本相同的查询,每个表一次。)

【讨论】:

谢谢。为了确保我理解,row[0] == 指标名称?行[2:12] == 1960 到 1970 年吗? 是的,...有点。每次循环 row 都会是一组值,代表 csv 中的一行。 row[0] 是元组中的第一个值。 row[2:12] 是元组中的第三个到第十二个值。 那么在 for 循环中,为什​​么要与 row[:2] 和 row[2:12] 重叠,然后再与 row[12:22] 重叠?那不是每个元组 2 和 12 两次吗? 与 Python 范围一样,Python 切片是半开区间。 row[2:12] 表示 row[2]row[11]row[12:22] 表示 row[12]row[21]。起初这可能看起来很奇怪,但它具有某些优点,例如可以很容易地判断一个切片中有多少项(减去 12-2 告诉您有 10 个项),并且它有助于为相邻切片编写表达式,例如作为row[i:j]row[j:k],无需在您的代码中粘贴+1s。 顺便说一句,我鼓励您使用 Python 交互式 shell,甚至在代码中粘贴 print 语句来探索各种表达式的值。这是我探索 Python 和弄清代码如何工作的第一个工具。

以上是关于使用 Python 将特定列数据从 CSV 导入不同的 MYSQL 表的主要内容,如果未能解决你的问题,请参考以下文章

Python:使用熊猫从csv文件中提取特定列(包含特殊字符)

python 如何将数据写入某个csv文件的特定位置?

如何使用 Python 从导入的 csv 计算纬度/经度点之间的距离?

csv从excel导入phpmyadmin缺少数据

python - 使用一个标准(从开尔文到摄氏度)替换csv中特定列中的一些值。

将 csv 文件导入 python 后,为啥我的某些数据列在我的数据框中无法识别