python批量读写大数据文件

2019-10-15 21:15:33 meiguanxi7878 阅读数 122

如果你有个5、6 G 大小的文件,想把文件内容读出来做一些处理然后存到另外的文件去,你会使用什么进行处理呢?不用在线等,给几个错误示范:有人用multiprocessing 处理,但是效率非常低。于是,有人用python处理大文件还是会存在效率上的问题。因为效率只是和预期的时间有关,不会报错,报错代表程序本身出现问题了~

Python处理大数据的劣势:

1、python线程有gil,通俗说就是多线程的时候只能在一个核上跑,浪费了多核服务器

2、python执行效率不高,在处理大数据的时候,效率不高

3、绝大部分的大公司,用java处理大数据不管是环境也好,积累也好,都会好很多

Python处理数据的优势(不是处理大数据):

1、异常快捷的开发速度,代码量巨少

2、丰富的数据处理包,不管正则也好,html解析啦,xml解析啦,用起来非常方便

3、内部类型使用成本巨低,不需要额外怎么操作(java,c++用个map都很费劲)

4、公司中,很大量的数据处理工作工作是不需要面对非常大的数据的

5、巨大的数据不是语言所能解决的,需要处理数据的框架(hadoop, mpi。。。。)虽然小众,但是python还是有处理大数据的框架的,或者一些框架也支持python

6、编码问题处理起来太太太方便了

结论:

1、python可以处理大数据

2、python处理大数据不一定是最优的选择

3. python和其他语言(公司主推的方式)并行使用是非常不错的选择

4. 因为开发速度,你如果经常处理数据,而且喜欢linux终端,而且经常处理不大的数据(100m一下),最好还是熟悉一下python

对Python感兴趣或者是正在学习的小伙伴,可以加入我们的Python学习扣qun:784758214,看看前辈们是如何学习的!从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!分享一些学习的方法和需要注意的小细节,教你如何实现边学习边用Python赚钱的学习方式。点击加入我们的 python学习者聚集地

为什么用python处理大文件总有效率问题?

如果工作需要,立刻处理一个大文件,你需要注意两点:

一、大型文件的读取效率

面对100w行的大型数据,经过测试各种文件读取方式,得出结论:

with open(filename,‘rb’) as f:

for fLine in f:

pass

方式最快,100w行全遍历2.7秒。基本满足中大型文件处理效率需求。如果rb改为r,慢6倍。但是此方式处理文件,fLine为bytes类型。但是python自行断行,仍旧能很好的以行为单位处理读取内容。

二、文本处理效率问题

这里举例ascii定长文件,因为这个也并不是分隔符文件,所以打算采用列表操作实现数据分割。但是问题是处理20w条数据,时间急剧上升到12s。本以为是byte.decode增加了时间。遂去除decode全程bytes处理。但是发现效率还是很差。

最后用最简单方式测试,首次运行,最简单方式也要7.5秒100w次。

那么关于python处理大文件的技巧,从网络整理三点:列表、文件属性、字典三个点来看看。

1.列表处理

def fun(x):尽量选择集合、字典数据类型,千万不要选择列表,列表的查询速度会超级慢,同样的,在已经使用集合或字典的情况下,不要再转化成列表进行操作,比如:

values_count = 0

不要用这种的


if values in dict.values():

values_count += 1

尽量用这种的

if keys,values in dict:

values_count += 1

后者的速度会比前者快好多好多。

2、对于文件属性

如果遇到某个文件,其中有属性相同的,但又不能进行去重操作,没有办法使用集合或字典时,可以增加属性,比如将原数据重新映射出一列计数属性,让每一条属性具有唯一性,从而可以用字典或集合处理:

return '(' + str(x) + ', 1)'

list(map(fun,[1,2,3]))

使用map函数将多个相同属性增加不同项。

3、对于字典

多使用iteritems()少使用items(),iteritems()返回迭代器:

>>> d = {'a':1,'b':2}

>>> for i in d.items() :

('a',1)

('b',2)

>>> for k,v in d.iteritems() :

... print k,v

('a',1)

('b',2)

在学习过程中有什么不懂得可以加我的
python学习交流扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容

字典的items函数返回的是键值对的元组的列表,而iteritems使用的是键值对的generator,items当使用时会调用整个列表 iteritems当使用时只会调用值。

除了以下5个python使用模块,你还有什么技巧解决大文件运行效率的问题吗?

1. 读写文件技术,今后会用到测试数据的参数化和测试报告写作功能中~

2. 数据处理技术,今后测试脚本的测试数据处理过程可以用到~

3. 数据统计分析技术,今后会在测试结果分析中用到

4. 图表展示技术,在今后的测试框架中相关测试报告会用到

5. 程序自动触发技术,可用于测试脚本程序的自动执行。

2017-12-16 10:07:59 huluanchushou 阅读数 613

转自:http://blog.csdn.net/u010700335/article/details/42025391,如侵删
(0)目录
快速学Python 和 易犯错误(文本处理)
Python文本处理和Java/C比对
十分钟学会Python的基本类型
快速学会Python(实战)
大数据处理之道(十分钟学会Python)
一:python 简介
(1)Python的由来
Python(英语发音:/ˈpaɪθən/), 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991
年。Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结
在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,
比 如3D游戏中的图形渲染模块,性能要求特别高,就可以用C++重写。
(2)Python 语法简介 —- 类型转化
int(x [,base ]) 将x转换为一个整数

long(x [,base ]) 将x转换为一个长整数

float(x ) 将x转换到一个浮点数

complex(real [,imag ]) 创建一个复数
str(x ) 将对象 x 转换为字符串

repr(x ) 将对象 x 转换为表达式字符串

eval(str ) 用来计算在字符串中的有效Python表达式,并返回一个对象

tuple(s ) 将序列 s 转换为一个元组

list(s ) 将序列 s 转换为一个列表

chr(x ) 将一个整数转换为一个字符

unichr(x ) 将一个整数转换为Unicode字符

ord(x ) 将一个字符转换为它的整数值

hex(x ) 将一个整数转换为一个十六进制字符串

oct(x ) 将一个整数转换为一个八进制字符串
(3)Python 语法简介 —- 类型转化
s + r 序列连接

s * n , n * s s的 n 次拷贝,n为整数

s % d 字符串格式化(仅字符串)

s[i] 索引

s[i :j ] 切片

x in s , x not in s 从属关系
for x in s : 迭代

len(s) 长度

min(s) 最小元素

max(s) 最大元素

s[i ] = x 为s[i]重新赋值

s[i :j ] = r 将列表片段重新赋值

del s[i ] 删除列表中一个元素

del s[i :j ] 删除列表中一个片段
(4)(3)Python 语法简介 —- 类型转化
x >> y 右移

x & y 按位与

x | y 按位或

x ^ y 按位异或 (exclusive or)

~x 按位翻转

x + y 加

x - y 减

x * y 乘

x / y 常规除
x // y 地板除

x ** y 乘方 (xy )

x % y 取模 (x mod y )

-x 改变操作数的符号位

+x 什么也不做

~x ~x=-(x+1)

abs(x ) 绝对值

divmod(x ,y ) 返回 (int(x / y ), x % y )
pow(x ,y [,modulo ]) 返回 (x ** y ) x % modulo

round(x ,[n]) 四舍五入,n为小数点位数

x < y 小于

x > y 大于
x == y 等于

x != y 不等于(与<>相同)

x >= y 大于等于

x <= y 小于等于
二:python应用
(1) 文件处理
[python] view plain copy
filename = raw_input(‘Enter your file name’) #输入要遍历读取的文件路径及文件名
file = open(filename,’r’)
done = 0
while not done:
aLine = file.readline()
if(aLine != ”):
print aLine,
else:
done = 1
file.close() #关闭文件
解释:
.readline() 和 .readlines() 之间的差异是后者一次读取整个文件,.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for … in … 结构
进行处理。另一方面,.readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline()。
如果Python文件读到了文件尾,则会返回一个空字符串‘’,而如果是读到一个空行的话,则会返回一个‘\n’
Python的readline()方法,每行最后都会加上一个换行字符‘\n’。有时候有的文件最后一行没有以’\n’结尾时,不返回‘\n’。
readlines()方法返回的是一个列表,而readline()返回一个字符串。
(2)错误处理
Python报错TypeError: ‘str’ object is not callable
当一般内部函数被用作变量名后可能出现此错误。比如:
range=1
for i in range(0,1):
………
就会报这样的错误
这样的错会报在for行,但是时间引起的原因却是在range=1这行,如果两行相距较远,怎很难被发现。所以要特别注意不要用内部已有的变量和函数名作自定义变量名。或者str被预先定义了
str=10
for i in range(1,10):
print str(i)
(3) 综合应用,文件读取,控制台读取,时间转化,编码转换
[python] view plain copy
import time
from time import strftime
import sys
reload(sys)
sys.setdefaultencoding(‘utf8’)

-- coding: cp936 --

print (“Hello, Python!”)

!/usr/bin/python

a = 21
b = 10
c = 0

c = a + b
print “Line 1 - Value of c is “, c

c = a - b
print “Line 2 - Value of c is “, c

c = a * b
print “Line 3 - Value of c is “, c

c = a / b
print “Line 4 - Value of c is “, c

c = a % b
print “Line 5 - Value of c is “, c

a = 2
b = 3
c = a**b
print “Line 6 - Value of c is “, c

a = 10
b = 5
c = a//b
print “Line 7 - Value of c is “, c

for repeat its

list = [2, 4, 6, 8]
sum = 0
for num in list:
sum = sum + num
print(“The sum is:”, sum)

print and Input, assignment

print(“Hello, I’m Python!”)

name = input(‘What is your name?\n’)
print(‘Hi, %s.’ % name)

test for

fruits = [‘Banana’, ‘Apple’, ‘Lime’]
loud_fruits = [fruit.upper() for fruit in fruits]
print(loud_fruits)

open, write and read file

fo = open(“./tmp/foo.txt”,”w+”)
fo.write(“Python is a gerat language.\nYeah its great!!\nI am zhang yapeng, who are you?\n”)
t_str = u’我是张燕鹏,您是什么货色?’
print(t_str)
fo.write(t_str)
fo.close()

read and write

fr = open(“./tmp/foo1.txt”,”r+”)
fw = open(“foo_rw.txt”,”wb”)
done = 0;
localtime = time.asctime(time.localtime(time.time()))
print “Local current time : “, localtime
fw.write(localtime + “\n”)
while not done:
t_str = fr.readline()
if(t_str != ”):
print “Read String is : “, t_str
fw.write(t_str)
else:
done = 1
fr.close()
fw.close()

test time (import)

localtime = time.localtime(time.time())
print “Local current time : “, localtime

format the time from time import strftime

t_time = strftime( ‘%Y-%m-%d %H:%M:%S’, localtime)
print “formatting local current time : “, t_time

design the time by yourself

year = str(localtime.tm_year)
mon = str(localtime.tm_mon)
day = str(localtime.tm_mday)
hour = str(localtime.tm_hour)
mins = str(localtime.tm_min)
sec = str(localtime.tm_sec)
newtime = u”时间是: ” + year + “年” + mon + “月” + day + “日 ” + hour + “:” + mins + “:” + sec
print “Local current time : “, newtime

(4)运行图:

(5) 总结:
(1)Python是一门入手非常快的语言,处理大数据的好语言,一些规范非常类似于c++语言,例如语法和一些函数命名,文件的打开和读写,以及
读写方式,非常类似于c++
(2)正如,开头所写的 “python是胶水语言,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适
的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C++重写。”
(3)分享一下非常基础的系统的学习网站
(4)W3CSchool.cc (3)中提到的学习网站是非常基础的人们课程,要是想深入,具体的内容可以百度

2018-08-24 14:11:38 zhongqi2513 阅读数 30716

一、全面的爬虫工程师的技能单

    1、python编程语言基础
    2、HTTP协议(处理响应, )
    3、html,css,javascript基本web技能
    4、mysql/mongodb/redis等存储系统
    5、urllib/requests/scrapy/pyspider  用来模拟浏览器发起HTTP请求的组件
    6、抓包工具和网页分析工具(正则,bs4,xpath,selenuim 异步请求,模拟登陆,最难的验证码(机器学习), 反反爬虫)
    7、json/csv/db

    html  xml   半结构化

 

二、Python3.x教程

    廖雪峰Python3教程(文档):http://www.liaoxuefeng.com/
    菜鸟教程Python3教程(文档):http://www.runoob.com/python3/python3-tutorial.html

 

三、python基础内容点

    python编程语言简单介绍(产生背景,优缺点,流行度)
    python的开发环境搭建(linux,windows,python,pycharm)
    python的hello world
    python关键字查看
    python的变量定义
    python的数据类型(Number String List Tuple Set Dict)
    python的注释(单行和段落)
    python的输入输出(print 和 input)
    python数据类型转换/常用数值运算/类型判断
    python的集合,列表,元组,字典
    python的流程控制for和while和if(break, continue, pass)
    python的切片
    python的代码缩进(换行,段落)
    python函数(自定义函数,常用内置模块,常用函数,函数调用)
    python异常
    python模块(内置模块,导入模块,自定义模块)
    python迭代器和生成器
    python面向对象
    python读写文件IO
    python数据库和JSON和CSV


四、爬取单

    名言网:http://quotes.toscrape.com
    中国天气网
    必应词典翻译/身份证归属地/手机号归属地
    拉勾招聘职位
    当当畅销书
    豆瓣影评
    链家/自如租房/如家
    糗事百科/内涵段子/新浪微博
    校花/校草照片
    起点小说
    微信公众号
    知乎热点
    B站用户
    NBA2017-2018赛季比较详细数据
    猫眼电影


五、爬虫

    概念:
    1、爬虫:网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网www信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
    2、爬虫:使用任何技术手段,批量获取网站信息的一种方式。关键在于批量。
    3、爬虫:根本目的在于获取网页源码中的数据。更深入一些,就会出现和网页进行POST交互从而获取服务器接收POST请求后返回的数据!总结:爬虫就是由计算机自动与服务器交互获取数据的工具。

    爬虫相关的其他核心概念:
    反爬虫:使用任何技术手段,阻止别人批量获取自己网站信息的一种方式。关键也在于批量。
    误伤:在反爬虫的过程中,错误的将普通用户识别为爬虫。误伤率高的反爬虫策略,效果再好也不能用。
    拦截:成功地阻止爬虫访问。这里会有拦截率的概念。通常来说,拦截率越高的反爬虫策略,误伤的可能性就越高。因此需要做个权衡。
    资源:机器成本与人力成本的总和。

    爬虫的分类
    1、聚焦爬虫:开发人员针对特定用户而开发的数据采集程序   聚焦爬虫
    2、通用爬虫:尽可能的爬取所有的网页,  搜索引擎

    基本流程:
    1、发送请求(urllib, requests)  在浏览器的地址栏中输入了URL之后回车的那个动作
    2、获取页面内容  得到服务器接收请求之后进行处理得到的网页源代码
    3、解析页面(bs4, xpath,正则re,jsonpath, pyquery, json)  解析源码,抽取数据
    4、异步动态加载/验证码处理(selenium, phantomJs)
    5、抽取并存储内容(json,csv/tsv, 数据库)    处理数据,存储数据
    
    爬虫的工作原理

    爬虫的工作方式

        有两种策略:

            1、深度优先爬取

            2、广度优先爬取

        response = urllib.request.urlopen("https://www.baidu.com/")
        content = response.read() 

        content是一个网页的源码组成的一个字符串。

        这个源码中会包含很多的其他的http地址  URL  怎么去对待这个URL ? 

        https://movie.douban.com/top250
        https://movie.douban.com/top250?start=25&filter=

        基本上,也就是除了带分页的是标准的广度优先之外, 其他的基本上都是 
        广度 + 深度


    搜索引擎的工作原理

        hadoop的产生

        google   nutch  爬虫    doug cutting (lucene)

        几乎是爬取了整个网络的所有网页,所以每个网页都存储下来的话,那么数据量必然很大。

        数据量特别大

        为什么大数据的应用技术, 最先从google弄出来。

        在存储的时候,有必要把所有的网页内容都存储下来么?

        这个URL中有哪些关键信息存储下来。!!
        关键信息就是这个网页中的, 核心


        排序   PageRank   value 分数   PageRank

        就是给每一个网页的对应的某一个关键字都衡量出一个  分数

        

六、爬虫框架

    scrapy 
    pyspider

 


七、反爬虫 和 反反爬虫

    1、爬虫领域的一些相关概念:
    爬虫:使用任何技术手段,批量获取网站信息的一种方式。关键在于批量。
    反爬虫:使用任何技术手段,阻止别人批量获取自己网站信息的一种方式。关键也在于批量。
    误伤:在反爬虫的过程中,错误的将普通用户识别为爬虫。误伤率高的反爬虫策略,效果再好也不能用。
    拦截:成功地阻止爬虫访问。这里会有拦截率的概念。通常来说,拦截率越高的反爬虫策略,误伤的可能性就越高。因此需要做个权衡。
    资源:机器成本与人力成本的总和。

    2、约定协议/君子协定 robots.txt
    robots协议:协议指明通用爬虫可以爬取网页的权限
    robots协议是一种约定,一般是大型公司的程序或者搜索引擎等遵守

    3、为什么要反爬虫?
        1、爬虫占总PV比例较高,过多消耗服务器资源
        2、公司的免费资源被批量爬走,利人损己
        3、法律问题
    
    4、反爬虫应对策略
        1、技术压制
        2、嘲讽
        3、放水

    

2016-05-16 14:42:01 kellyseeme 阅读数 3855

python中读取数据的时候有几种方法,无非是read,readline,readlings和xreadlines几种方法,在几种方法中,read和xreadlines可以作为迭代器使用,从而在读取大数据的时候比较有效果.

在测试中,先创建一个大文件,大概1GB左右,使用的程序如下:

import os.path
import time
while os.path.getsize('messages') <1000000000:
    f = open('messages','a')
    f.write('this is a file/n')
    f.close()

print 'file create complted'

在这里使用循环判断文件的大小,如果大小在1GB左右,那么结束创建文件。--需要花费好几分钟的时间。


测试代码如下:

#22s
start_time = time.time()
f = open('messages','r')
for i in f:
    end_time = time.time()
    print end_time - start_time
    break
f.close()

#22s
start_time = time.time()
f = open('messages','r')
for i in f.xreadlines():
    end_time = time.time()
    print end_time - start_time
    break
f.close()


start_time = time.time()
f = open('messages','r')
k= f.readlines()
f.close()
end_time = time.time()
print end_time - start_time

使用迭代器的时候,两者的时间是差不多的,内存消耗也不是很多,使用的时间大概在22秒作用

在使用完全读取文件的时候,使用的时间在40s,并且内存消耗相当严重,大概使用了1G的内存。。


其实,在使用跌倒器的时候,如果进行连续操作,进行print或者其他的操作,内存消耗还是不可避免的,但是内存在那个时候是可以释放的,从而使用迭代器可以节省内存,主要是可以释放。

而在使用直接读取所有数据的时候,数据会保留在内存中,是无法释放这个内存的,从而内存卡死也是有可能的。


在使用的时候,最好是直接使用for i in f的方式来使用,在读取的时候,f本身就是一个迭代器,其实也就是f.read方法



2017-06-19 23:13:49 weixin_38569817 阅读数 1335

在单机环境下部署好mongodb,利用python可以方便的地处理和分析数据。本次实例中引入阿里天池算法大赛中口碑数据,主要文件为shop_info.txt,user_pay.txt,user_view.txt,其中user_pay最大,大约为2G左右。如果一次性加载这样的文件到内存,明显并不合适。倘若同时需要用到几个大文件进行关联操作,那就真心爆炸了。

  下面就简单介绍下如何利用python结合mongodb来处理大数据文件,包括写入数据库,读取数据库数据。

首先在开始编写代码之前,需要安装python当前版本相对应的mongodb,然后在命令行启动mongodb,--dbpath=D:\mongodb\db

为了避免每次都要手动启动数据库,可以将mongDB安装为windows服务,让该服务随windows启动而开启,这样,我们在使用mongoDB的时候直接连接数据库就可以了,省去了手动开启服务的繁琐。将mongoDB安装为windows服务并开启的命令:

      

       开启服务:

     


下面介绍下主要的代码。

#coding=utf-8
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import datetime
import pymongo
import os

def InsertData():
    #mongodb创建用户
    client = pymongo.MongoClient('localhost',27017)
    #创建数据库
    IJCAI = client['IJCAI']
    #创建表
    shop_info_table = IJCAI['shop_info_table']
    shop_info_path = "../dataset/IJCAI-17/dataset/shop_info.txt"
    columnsName = ['shop_id','city_name','location_id','per_pay','score','comment_cnt','shop_level','cate_1_name','cate_2_name','cate_3_name']
    #读写大文件常用方式,当然此文件并不大
    with open(shop_info_path,'r',encoding= 'utf-8') as f:
        shop_info_data = []
        for line in f:
            line = line.strip().split(',')
            #将字段与value组合,然后转换成字典
            shop_info_data.append(dict(zip(columnsName,line)))
    #每次清除表
    shop_info_table.remove()
    #插入数据
    shop_info_table.insert(shop_info_data)

    user_pay_table = IJCAI['user_pay_table']
    user_pay_path = "../dataset/IJCAI-17/dataset/user_pay.txt"
    columnsName = ['user_id','shop_id','time_stamp']
    with open(user_pay_path) as f:
        index = 1
        user_pay_data = []
        #user_pay_table.remove()
        for line in f:
            line = line.strip('\n').split(',')
            user_pay_data.append(dict(zip(columnsName,line)))
            #文件较大,选择批量插入
            if index == 10000:
                user_pay_table.insert(user_pay_data)
                user_pay_data.clear()
                index = 0
            index += 1
    
    user_view_table = IJCAI['user_view_table']
    user_view_path = "../dataset/IJCAI-17/dataset/user_view.txt"
    columnsName = ['user_id','shop_id','time_stamp']
    with open(user_view_path) as f:
        index = 1
        user_view_data = []
        user_view_table.remove()
        for line in f:
            line = line.strip('\n').split(',')
            user_view_data.append(dict(zip(columnsName,line)))
            if index == 10000:
                user_view_table.insert(user_view_data)
                user_view_data.clear()
                index = 0
            index += 1
    #创建索引
    user_pay_table.create_index('time_stamp')
    user_view_table.create_index('time_stamp')
    print(user_pay_table.index_information())
    print(user_view_table.index_information())

shop_info = {}
user_pay = {}
user_view = {}

#从数据库加载数据
def loadData():
    client = pymongo.MongoClient('localhost',27017)
    IJCAI = client['IJCAI']
    shop_info_table = IJCAI['shop_info_table']
    user_pay_table = IJCAI['user_pay_table']
    user_view_table = IJCAI['user_view_table']
    print(shop_info_table.count())
    print(user_pay_table.count())
    print(user_view_table.count())
    global shop_info
    shop_info = shop_info_table.find()
    global user_pay
    startTime = '2015-07-01 00:00:00'
    endTime = '2016-11-01 00:00:00'
    dateRange = pd.date_range(startTime,endTime,freq='MS')
    strSDate = str(dateRange[0])
    strEDate = str(dateRange[1])
    strWhere = "this.time_stamp >=" + '\'' + strSDate + '\'' + "&& this.time_stamp <" + '\'' + strEDate + '\''
    #可以用类似SQL的形式来select数据
user_pay = user_pay_table.find({"$where":strWhere},{"_id":False}) global user_view user_view = user_view_table.find({"$where":strWhere})[:1]
    #以时间周期来读取数据
    for index,date in enumerate(dateRange):
        strSDate = str(dateRange[index])
        strEDate = str(dateRange[index+1])
        strWhere = "this.time_stamp >=" + '\'' + strSDate + '\'' + "&& this.time_stamp <" + '\'' + strEDate + '\''
       user_pay = user_pay_table.find({"$where":strWhere})
        path = strSDate[:10] + '.txt'
        fp = open(path,'w+')
        for x in user_pay:
            x = [x for x in x.values() if type(x) == type('abc')]
            x = ','.join(x)
            fp.write(x)
            fp.write('\n')
            fp.flush()
        fp.close()
    
    '''
    #find的具体用法可以在google一下
    for u in user_view_table.find()[0:5]:
        print(u)
    print('\n')
    '''

if __name__ == "__main__":
    loadData()
    shop_info = [x for x in shop_info]
    print(len(shop_info))
    user_pay = [x for x in user_pay]
    user_pay_db = pd.DataFrame
    #    x = pd.Series(x)
    #    print(type(x))
    #    user_pay_db = pd.DataFrame(x)
    user_view = [x for x in user_view]
    print(user_view)
    print(len(user_view))
    print("OK")