背景描述
想获得1000条名单中成交客户信息,但对于远程服务器又仅有只读权限,不好直接使用数据库表连接。又想把数据库目标表通过pandas读出,写入到文件中。发现近千万的数据量本机内存吃不消,写进了D盘的文件,却无奈内存太小,读不出来。
解决方法
1)顺序读入1000条名单
2)循环构造1000条检索语句,查询数据库
3)将每一次检索到的结果写入csv文件
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
import cx_Oracle
conn = cx_Oracle.connect('username','password','ip/sername')
cursor = conn.cursor()
flow = open('./defeat.csv','w',encoding='utf-8')
csv_writer = csv.writer(flow,delimiter=',')
s = """select * from table_name where rownum <=10"""
cursor.execute(s)
header = []
# 写入表头
for i in range(len(cursor.description)):
header.append(cursor.description[i][0])
csv_writer.writerow(header)
for i in range(0, len(mobile_nos)):
mobile_no = str(mobile_nos['手机号'][i])
sql = """select * from table_name where (customer_status = '51080015' or customer_status = '51080020') and mobile_no =""" +"'"+mobile_no+"'"
cursor.execute(sql)
record = cursor.fetchone()
print(i)
while record is not None:
try:
data = []
for i in range(len(record)):
data.append(record[i])
csv_writer.writerow(data)
record = cursor.fetchone()
except:
pass
continue
flow.close()
print('done')
注意点
1)在从游标中执行fetchone()操作时,有可能会报编码错误
解决办法是对编码进行配置:
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
如果还是有数据编码问题,只能写个exception,抛出异常或者直接跳过去了。
try:
data = []
for i in range(len(record)):
data.append(record[i])
csv_writer.writerow(data)
record = cursor.fetchone()
except:
pass
continue
2)表名较多可以直接通过cursor.description获得表头,这是个元组,可通过下标进行访问
3)每一次调用cursor.fetchone()操作,游标都会向前移动一个,所以不能采用while cursor.fetchone() is not None进行校验
👏👏👏再看看我们以前的文章😃😃😃
🌺 Excel中数据分析工具库-相关系数篇
🌺 干货,手把手教会你做相关性分析
🌺 5年数据分析路,小结。
🌺 用户细分及画像分析
🌺 K-近邻算法及实践
欢迎关注,微信公众号“数据分析师之家”
扫描二维码 关注我们
💁提供职业规划、简历指导、面试辅导服务哦
QQ交流群:254674155