Python从MySQL和csv读取大量数据

  1. 从MySQLdb接口读取百万条以上记录的表格, 主要是要指定游标的种类, 才不会造成程序停留在执行sql语句的等待返回过程中.

有四种Cursor:

Cursor

SSCursor

DictCursor

SSDictCursor

前两种返回tuple结构, 后两种返回字典结构.

另外,带有SS前缀的Cursor是未带缓存的游标(Unbuffered Cursor),它执行命令后结果不会从MySQL server上取下来, 而是而是立即返回, 因此使用该SSCursor有两点要注意:

  • 用fetchone() 获取每一行结果进行处理

  • 不要使用fetchall(), 否则将会从server上取下所有数据, 同样会造成程序卡住.

使用方法有两种:

​ a. 在MySQLdb.connection初始化链接时指定:

1
2
3
4
5
6
import MySQLdb
import MySQLdb.cursors

db = MySQLdb.Connection(host=db_host, user=db_username, passwd=db_password,
charset="utf8", init_command="set names utf8",
cursorclass=MySQLdb.cursors.SSDictCursor)

​ b. 在Cursor构造时指定:

1
2
3
4
5
import MySQLdb
from MySQLdb.cursors import SSCursor

db = MySQLdb.connect(...)
cursor = SSCursor(db)
  1. 从csv文件读取大量数据, 这里要里用pandas库

以下面的数据为例
ipnum,isp,isp_id
16777216,,
16777472,电信,100017
16777728,电信,100017
16777984,电信,100017

1
2
3
4
5
6
import pandas as pd

for df in pd.read_csv('isp.txt', chunksize=50000, iterator=True, encoding='utf-8', na_values=''):
mod_df = df.fillna('Unknown') # 填充空字段,填充后的结果会返回
for index, row in mod_df.iterrows():
print row['ipnum'], row['isp'], row['isp_id']

chunksize指定了每次读取的块大小, df是迭代的DataFrame.
注意df.fillna( )并不会修改df,而是把修改后的返回.
iterrows( )方法可以返回迭代的index 和 字典形式的结果.