• python+MongoDB使用示例


      本博客起源于博主的大三NoSQL课程设计,采用python+MongoDB结合方式,将数据从txt文件导入MongoDB之中,再将其取出以作图。主要技术是采用python与MongoDB结合存储读取方案,所以本博客截取了课设的部分内容,主要讲解python操作MongoDB方案实现,以给想要学习python+MongoDB编程开发的同学学习练手。

    设计思路

    1、Python编程语言和MongoDB有驱动包pymongo连接,使用pymongo对MongoDB进行编程开发、数据读取,以及后续的画图分析和数据可视化处理

    2、使用的数据文件sample.txt.txt

    设计内容

     1、先使用dataToMongo.py将文件清洗后导入MongoDB中。

       (1) 创建并连接到MongoDB 中的nosql数据库;

       (2) 创建并连接到nosql数据库的集合sample;

     2、对读出的数据进行可视化处理

       (1) 画图主要使用的Python包为matplotlib.plot

    设计步骤及结果测试

    1、先使用dataToMongo.py将文件清洗后导入MongoDB中。

      (1) 采用pymongo连接驱动

      (2) 采用pymongoMongoClient类连接mongod

      (3) python中使用的mongo常用语法与mongoJSON语法基本相同。

     MongoDB启动:

     

    启动Python脚本dataToMongo.py将数据从文件中读出并存入MongoDB中:

      注意要使用以下命令 (由于前期使用python+Hadoop的方式编写,所以使用了unix输入输出流来读数据):

      # cat sample.txt.txt | ./dataToMongo.py

     数据成功存入MongoDB:

     

    dataToMongo.py 

    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
    # 这个文件是用来将数据存入MongoDB中数据库nosql的
    # collection为 sample (db.sample.find())
    # 格式为:"line1": [data1,data2...]
    
    from pymongo import MongoClient
    import sys
    
    # Connect to mongod, use DB: 'nosql', use COLLECTION: 'sample'
    conn = MongoClient('127.0.0.1', 27017)  #连接mongod
    db = conn.nosql                         #连接'nosql'数据库,没有则自动创建
    sample = db.sample                      #使用sample集合,没有则自动创建
    
    n = 1
    data = list() 
    for line in sys.stdin:
        data = line.strip().split()
        linenum="line"+str(n)               # linenum是line字符串+数字组成的字符串,后面插入数据集时会用到
        if n==1:
            pass                            # 第一行数据是没用的,清洗掉
        elif n==2:
            data = data[4:]                 # 实测观察数据从第四个数据开始
            data[0] = '-3.1415926536'       # 原数据是‘Real=-3.1415926536’,所以将数据修改下
            for index,item in enumerate(data):
                data[index] = float(item)   # 将原来是字符串的数据转为float类型
            sample.insert({                 # 将数据插入(insert)MongoDB中的sample集合
                "line":linenum,             # 这里我为了后续作图方便,插入了一个{line:linenum}的键值对
                "value":data                # {value: data}键值对, data是一个list变量哦
            })
        else:
            data = data[2:]                 # 和第二行的数据不一样,实测观察出的,有时候编程是要一步步观察修改的
            for index,item in enumerate(data):  # 考验自己的动手能力,怎么观察实现要自己想办法了
                data[index] = float(item)
            sample.insert({
                "line":linenum,
                "value":data
            })
        n+=1

    2、对读出的数据进行可视化处理。

    画图脚本:main.py

    (1) 第一个图:

    蓝色的线是在1.0*10^9频率下,phi=0

    橙色的线是在1.0*10^9频率下,phi=1.5707963268

    横坐标是Theta(degree),范围从-Pi ~Pi;纵坐标是电场值。

    相同频率下,theta角度越大,电场值越小

    main.py 

    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
    # file : main.py
    # 这个文件是用来读取MongoDB中nosql数据库.sample集合数据
    # 读出之后作图
    
    from pymongo import MongoClient
    import matplotlib.pyplot as plt
    
    # Connect to mongod, use DB: 'nosql', use COLLECTION: 'sample'
    conn = MongoClient('127.0.0.1', 27017)                             #连接mongod
    db = conn.nosql                                                    #连接'nosql'数据库,没有则自动创建
    sample = db.sample                                                 #使用sample集合,没有则自动创建
    
    angle_theta_radian=sample.find_one({"line":"line2"})['value']      #使用find_one查找第2行的数据,取其名为‘value’的键值对的值
    data_phi0=sample.find_one({"line":"line3"})['value']               #使用find_one查找第3行的数据,取其名为‘value’的键值对的值
    data_phi90=sample.find_one({"line":"line48"})['value']             #使用find_one查找第48行的数据,取其名为‘value’的键值对的值
    
    plt1, = plt.plot(angle_theta_radian,data_phi0)                     #作图1
    plt2, = plt.plot(angle_theta_radian,data_phi90)                    #作图2
    plt.legend([plt1,plt2],['Electrial Field1','Electrial Field2'],loc='upper right')  #设置图例
    plt.xlabel('Theta (degree)')                                       #设置x轴标签
    plt.ylabel('Electrical field (V/m)')                               #设置y轴标签
    plt.show()                                                         #以上一起显示出来

     (2) 第二个图:

    蓝色的线是,在1.0*10^9频率下,phi=0;

    橙色的线是,在1.02*10^9频率下,phi=0;(第93行: line93)

    横坐标是Theta(degree),范围从-Pi ~Pi;纵坐标是电场值。

     

    相同theat角度下,频率越高,电场值绝对值越大。

    实现:将main.py脚本文件中的

    data_phi90=sample.find_one({"line":"line48"})['value']

    修改为:

    data_phi90=sample.find_one({"line":"line93"})['value']

    即可得出。

    数据文件说明:

    1、数据文件概述:是测试的电场强度数据文件。

    包括多个频率测试的电场强度,每个频率的数据是一个数据块。

    在一个频率点测试的数据(每一块数据里面),又包括多行数据(每行是一个theta角度的数据)和多列数据(每一列为一个phi角度的数据)。

    2、数据文件含义:

    3、实验测试与数据的关系如下

     

    对于文件sample.txt.txt,只有两个频率(109频率和1.2*109频率)。

     感谢李老师的数据文件说明,如果有任何侵权问题,博主可以立即删除。

     博客好像发不了文件,如果需要数据文件的话请留言邮箱,看到了发给你。

  • 相关阅读:
    vue实现图片路径传送
    title中添加小图标
    张钊的第一份作业
    张钊的第二份作业
    在Windows Server 2008 R2环境下安装活动目录失败的一个解决方法
    如何把SubVersion的服务程序变为Window后台服务形式
    一个关于静态方法调用的问题。
    WCF配置中遇到的问题:如何把Hostname修改成IP
    删除Visual Studio最近的项目(转载)
    有时候用ifstream或ofstream打开带有中文路径的文件会失败
  • 原文地址:https://www.cnblogs.com/fa-learning/p/9074897.html
Copyright © 2020-2023  润新知