之前介绍了在Pandas中读取MongoDB数据的方法,在索引出数据之后,将结果转换为列表list,然后在传入一个pandas的DataFrame中。
import pymongo
import pandas as pd
# 设置MongoDB连接信息
client = pymongo.MongoClient('localhost',27017)
cn_78 = client['cn_78']
project_info = cn_78['project_info']
data = pd.DataFrame(list(project_info.find()))
# 删除mongodb中的_id字段
del data['_id']
# 选择需要显示的字段
data = data[['aear','cate','subcate','name','maxmoney','minmoney','time']]
print(data)
这种方法很简单,但是有一个问题,就是在数据量大的时候,会大量的占用内存以及耗费时间,如果在内存不大的单机上进行操作,可能因为内存而导致主机崩溃。所以只适合少量数据下的使用。
今天介绍一个适合大量数据的方法,没有使用list列表转换来得方便,但是快速以及占用机器内存小。
第一步,编写好查询语句:
import pymongo
import pandas as pd
import csv
df = data.find(
{
'pay_time':{'regex':'2014-.*'},
'shop_name':'官方旗舰店',
'status':'已确认',
'or':[ {'pro_name':{'regex':'.*特价.*'}},{'pro_name':{'regex':'.*促销.*'}},{'pro_name':{'$regex':'.*优惠.*'}}]
},
{
'_id':0,
}
)
第二步,新建一个csv文件,遍历mongoDB的查询,并写入csv文件中:
with open('data.csv','w',encoding='utf-8',newline='') as files:
csvfiles = csv.DictWriter(files,fieldnames=['pay_time','send_num'])
csvfiles.writeheader()
n = 1
for i in df:
# print(i)
print('第{0}条'.format(n))
csvfiles.writerow({'pay_time':i['pay_time'],'send_num':i['send_num']})
n += 1
第三步,使用pandas进行读取
使用pandas读取csv文件直接使用read_csv()方法即可。
data = pd.read_csv('data.csv')
或是留作他用。
虽然需要进行三个步骤,但是在查询数据量大的情况下,所消耗的时间并不比直接进行list转换要多,多数情况下,都会很快的完成查询和写入。
最后,记得关闭数据库:
db.close()
养成好习惯。
文章版权所有:州的先生博客,转载必须保留出处及原文链接