将巨大的csv文件解析成mysql [python]

时间:2013-12-13 07:21:21

标签: python mysql csv

我将巨大的csv文件解析为mysql数据库时遇到了一些问题。

Csv文件如下所示:

ref1  data1  data2  data3...
ref1  data4  data5  data6...
ref2  data1  data2  data3 data4 data5..
ref2  data12 data13 data14
ref2  data21 data22...
.
.
.

Csv文件大约有1百万行或者大约7MB的zip文件或大约150MB的解压缩文件。

我的工作是将数据从csv解析为mysql,但只引用引用匹配时的数据/行。另一个问题是,从csv中的多行开始,我必须在mysql的一行中解析它以进行一次引用。

我尝试用csv.reader和每个引用的循环来做这个,但是速度很慢。

with con:
cur.execute("SELECT ref FROM users")
user=cur.fetchall()
for i in range(len(user)):
    with open('hugecsv.csv', mode='rb') as f:
        reader = csv.reader(f, delimiter=';')                               
        for row in reader:
            if(str(user[i][0])==row[0]):
                writer.writerow(row)

所以我在我的列表用户中有我要解析的所有引用。哪个是解析的方法?

请帮忙!

3 个答案:

答案 0 :(得分:2)

第一个明显的瓶颈是您要为数据库中的每个用户重新打开并扫描整个CSV文件。在csv上执行一次传递会更快:

# faster lookup on users
cur.execute ("select ref from users")
users = set(row[0] for row in cur.fetchall())

with open("your/file.CSV") as f:
    r = reader(f)
    for row in r:
        if row[0] in users:
            do_something_with(row)

答案 1 :(得分:1)

使用:

LOAD DATA INFILE 'EF_PerechenSkollekciyami.csv' TO `TABLE_NAME` FIELDS TERMINATED BY ';'

这是mysql中的内部查询命令。

我建议您不要使用标签来分隔列,建议您通过sed来更改它;或其他角色。但您也可以尝试使用标签。

答案 2 :(得分:0)

您没有包含所有逻辑。如果您只想将所有内容导入到单个表中,

cur.execute("LOAD DATA INFILE 'path_to_file.csv' INTO TABLE my_table;")

MySQL直接做到了。你不能比这更快。

Documentation