#!/usr/bin/env python3

import pymongo
import datetime
import os yesterday = str(datetime.date.today() - datetime.timedelta(days=1)) def mongo2csv(db_name, ts_string=yesterday, column_handle=None, column_delete=None):
''' :param db_name: 表名
:param ts_string: 日期
:param column_handle: 需要处理的列,
格式{k:v} ,
k:需要处理的列,
v:1.数字,即列表索引,取列表的第几个元素
2.字符串,即字典key,取子字典的某个value
3.join ,即需要将列表转为字符串 :param column_delete: 需要删除的列
:return:
'''
print('starting...')
host = '127.0.0.1'
port = 5600
user = 'root'
password = ''
url = 'mongodb://' + user + ':' + password + '@' + host + ':' + str(port) + '/'
client = pymongo.MongoClient(url)
db = client.rental
collection = db[db_name]
select_condition = {'_id': 0, 'ts': 0}
if not column_delete:
column_delete = []
if not column_handle:
column_handle = {}
if len(column_delete) > 0:
for temp in column_delete:
select_condition[temp] = 0
title_dic = collection.find_one({'ts_string': ts_string}, select_condition)
title = sorted(title_dic.keys())
con = collection.find({'ts_string': ts_string}, select_condition)
file_name = db_name + '_' + yesterday + '.csv'
with open(file_name, 'a', encoding='utf8') as f:
f.write(','.join(title) + '\n')
for item in con:
for k, v in column_handle.items():
item[k] = item[k][v] if v != 'join' else (
'|'.join([str(x) for x in item[k]]) if isinstance(item[k], list) else item[k])
f.write(','.join([str(item[x]) for x in title]) + '\n') if __name__ == '__main__':
mongo2csv('lianjia_detail')
mongo2csv('mogu_detail', column_handle={'metroInfo': 0, 'rentType': 'value'})
mongo2csv('qingke_detail', column_handle={})
mongo2csv('xiangyu_detail', column_delete=['endDate','vacantStartDate','tabList','vacantEndDate'])
mongo2csv('ziru_detail', column_handle={'subway_line_code': 'join', 'subway_station_code': 'join'})
print(os.system('wc -l *.csv'))

mongo2csv的更多相关文章

随机推荐

  1. MySQL——修改一个表的自增值

    语句 alter table <table name> auto_increment=<value>; 示例 mysql; Query OK, rows affected (0 ...

  2. MT【314】正切比值

    (05复旦)已知三角形$\Delta ABC$满足$\tan A:\tan B:\tan C=1:2:3$,求$\dfrac{AC}{AB}$____ 解答:设$x=tan A$,利用恒等式$\tan ...

  3. <Android基础> (五) 广播机制

    1)接收系统广播:a.动态注册监听网络变化 b.静态注册实现开机启动 2)发送自定义广播:a.发送标准广播 b.发送有序广播 3)使用本地广播 第五章 5.1 广播机制 Android中的每个程序都可 ...

  4. Shell入门及实践

    解释器 解释器是一种命令解释器,主要作用是对命令进行运行和解释,将需要执行的操作传递给操作系统内核并执行 #!/bin/bash(默认),指定解释器 #!/bin/bash #这是第一个shell脚本 ...

  5. (BFS) leetcode 279. Perfect Squares

    Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...

  6. redis源码解析(1):redisObject对象说明

    Redis在实现键值对数据库时,并没有直接使用数据结构,而是基于已有的数据结构创建了一个对象系统,每种对象至少包含一种数据结构. redis3.0 中对象结构: typedef struct redi ...

  7. 通过Visualizing Representations来理解Deep Learning、Neural network、以及输入样本自身的高维空间结构

    catalogue . 引言 . Neural Networks Transform Space - 神经网络内部的空间结构 . Understand the data itself by visua ...

  8. Object is not a function

    如图报了一个这样的错,百度好多都说是函数名和html元素重名的问题.可是这个问题我想我这里是不存在的 可以看到就一个绑定事件,而且id名不是关键字 报错是在$.ajax这一行,索性就把submit-i ...

  9. 第十四节:再探MVC中路由的奥秘

    一. 基于RouteBase扩展 1. 原理 扩展RouteBase,同样使用的是MVC框架提供的MvcRouteHandler进行处理. 2. 步骤 1. 新建YpfRoute1类,继承RouteB ...

  10. 动态规划dp

    一.概念:动态规划dp:是一种分阶段求解决策问题的数学思想. 总结起来就一句话:大事化小,小事化了 二.例子 1.走台阶问题 F(10):10级台阶的走法数量 所以:F(10)=F(9)+F(8) F ...