今天终于把老板交代的事情忙完了,对于我这位计算机语言的小白来说,其中的艰辛不用说,一把辛酸泪啊!
在有计算机语言经验的老手而言,我这些问题似乎也不能算是问题,但我却卡了很久,对此,想把自己所遇到的困难
和解决方法都记录下来,避免以后犯同样的错误,慢慢进步吧,大神勿喷。
  首先老板让我去calipso的官网上下数据集,我找的是这个人的文章,照葫芦画瓢,把账号申请下来,并且下载了数据集。
CALIPSO数据下载方法与可视化

  下好了数据集之后,就开始坑爹的读数据了。我用的是python语言,之前想过用IDL语言或者是MATLAB做,但是我对着两门

语言不是太熟悉,所以老板最后还是让我用python做,之前怕python会运转的速度慢,但事实速度还可以。750个文件,两千多万的数据

不到一个多小时就读完了。结果还算满意,废话不多说,下面说说怎么做的吧。

  我是想在网上找到了一篇文章,虽然不是读calipso的数据,但是读的是modis的数据,大致相同,程序类比一下就好了

python 读取 modis hdf文件 

然后再结合老板要我读出的那一串数据就可以类比出我自己的代码了(注意,这里还算简单,但是输出的结果却是很蛋疼!!)

import os

from pyhdf.SD import SD, SDC
import pprint
import numpy as np
np.set_printoptions(threshold=np.NaN)
dir_list=os.listdir(r'D:\clouddata')
# print(len(dir_list))
for j in dir_list[0:int(len(dir_list)):2]:  #为了去hdf的文件名


    HDF_FILR_URL = "D:\clouddata\\"+j       #将其拼接成地址
    # print(HDF_FILR_URL)
    file = SD(HDF_FILR_URL)

    # print(file.info())
    datasets_dic = file.datasets()

    # for idx, sds in enumerate(datasets_dic.keys()):
        # print(idx, sds)
    sds_obj_profile_time = file.select('Profile_Time')
    sds_obj_feature_classification_flags = file.select('Feature_Classification_Flags')
    sds_obj_longitude = file.select('Longitude')# select sds
    sds_obj_latitude = file.select('Latitude')
    sds_obj_layer_top_altitude = file.select('Layer_Top_Altitude')
    sds_obj_layer_base_altitude = file.select('Layer_Base_Altitude')
    sds_obj_layer_top_pressure = file.select('Layer_Top_Pressure')
    sds_obj_layer_base_pressure = file.select('Layer_Base_Pressure')
    sds_obj_layer_top_temperature = file.select('Layer_Top_Temperature')
    sds_obj_layer_base_temperature = file.select('Layer_Base_Temperature')

    data_profile_time = str(sds_obj_profile_time.get())  # get sds data
    data_feature_classification_flags = str(sds_obj_feature_classification_flags.get())
    data_longitude = str(sds_obj_longitude.get())
    data_latitude = str(sds_obj_latitude.get())
    data_layer_top_altitude = str(sds_obj_layer_top_altitude.get())
    data_layer_base_altitude = str(sds_obj_layer_base_altitude.get())
    data_layer_top_pressure = str(sds_obj_layer_top_pressure.get())
    data_layer_base_pressure = str(sds_obj_layer_base_pressure.get())
    data_layer_top_temperature = str(sds_obj_layer_top_temperature.get())
    data_layer_base_temperature = str(sds_obj_layer_base_temperature.get())
    filename = 'clouddata_base.txt'
    with open(filename, 'w') as f:


        a=len(sds_obj_profile_time.get())
        strs='data_profile_time'+"     "+"data_feature_classification_flags"+"     "+"data_longitude"+"     "+"data_latitude"+"     "+"data_layer_top_altitude"+"     "+"data_layer_base_altitude"+"     "+"data_layer_top_pressure"+"     "+"data_layer_base_pressure"+"     "+"data_layer_top_temperature"+"     "+"data_layer_base_temperature"+"\n"
        for i in range(0,2):
            strs+=str(sds_obj_profile_time.get()[i])+" "+str(sds_obj_feature_classification_flags.get()[i])+" "+str(sds_obj_longitude.get()[i])+" "+str(sds_obj_latitude.get()[i])+" "+str(sds_obj_layer_top_altitude.get()[i])+" "+str(sds_obj_layer_base_altitude.get()[i])+" "+str(sds_obj_layer_top_pressure.get()[i])+" "+str(sds_obj_layer_base_pressure.get()[i])+" "+str(sds_obj_layer_top_temperature.get()[i])+" "+str(sds_obj_layer_base_temperature.get()[i])+'\n'

        f.write(strs)
        

这里要掌握的知识点有:os.listdir      select方法      get方法,多用在字典中。注意要想写到txt文本里,必须要是字符串类型。

然后输出的数据并不是我想要的,我想要的是一类数据都输出到一行上面,但是输出的数据像鬼使神差似的,总会在莫名其妙的地方

断行,我一开始以为是记事本一行有字符限制,确实有,每一行最多可以输出1024个字符,但是我的一行数据根本没达到1024个,我用了

我所会的各种方法,读出来的数据都是一样的。然后我就在想是不是数据库本身的原因。

如图所示,我的代码根本没有错,但就是得不到想要的结果,但是我后来发现他读出的数据虽然是中括号,但并不是列表,

而是数组,这就很关键了,虽然它自动换行了,但是我可以对数组里面的元素进行遍历,将其输入到一行就可以啦。

真正运行的代码如下:(对于初学者的我来说,里面有很多重复代码,比较low,等我看完函数部分,再进行改进,先把程序

跑通,后续在进行代码优化。)

# -*- coding: utf-8 -*-
import os

from pyhdf.SD import SD, SDC
import pprint
import numpy as np
np.set_printoptions(threshold=np.NaN)          #这一行和上一行的目的是在读出数据很多事,不会有省略号,数据全部可见
dir_list=os.listdir(r'D:\clouddata')
# print(len(dir_list))                           #输出文件的个数,1495
for v in dir_list[0:int(len(dir_list)):2]:
    
    text_name = v[0:-4]                        #v遍历的是我下载的文件名,取到倒数第5位,是为了去掉.hdf,为了下面的写入文件的命名
    filename = "D:\\pydata\\" + text_name + ".txt"     #有多少个文件,就可以生成多少TXT,并且命名,这个套路要学着。

    
    HDF_FILR_URL = "D:\clouddata\\"+v                #拼成一个地址,这样才能读数据
    # print(HDF_FILR_URL)
    file = SD(HDF_FILR_URL)

    # print(file.info())
    datasets_dic = file.datasets()

    # for idx, sds in enumerate(datasets_dic.keys()):
    #     print(idx, sds)
    sds_obj_profile_time = file.select('Profile_Time')
    # print(type(file.select('Profile_Time')))
    sds_obj_feature_classification_flags = file.select('Feature_Classification_Flags')
    sds_obj_longitude = file.select('Longitude')# select sds
    sds_obj_latitude = file.select('Latitude')
    sds_obj_layer_top_altitude = file.select('Layer_Top_Altitude')
    sds_obj_layer_base_altitude = file.select('Layer_Base_Altitude')
    sds_obj_layer_top_pressure = file.select('Layer_Top_Pressure')
    sds_obj_layer_base_pressure = file.select('Layer_Base_Pressure')
    sds_obj_layer_top_temperature = file.select('Layer_Top_Temperature')
    sds_obj_layer_base_temperature = file.select('Layer_Base_Temperature')
   
    data_profile_time = sds_obj_profile_time.get() # get sds data
    data_longitude = sds_obj_longitude.get()
    data_latitude = sds_obj_latitude.get()
    data_layer_top_altitude = sds_obj_layer_top_altitude.get()
    data_layer_base_altitude = sds_obj_layer_base_altitude.get()
    data_layer_top_pressure = sds_obj_layer_top_pressure.get()
    data_layer_base_pressure = sds_obj_layer_base_pressure.get()
    data_layer_top_temperature = sds_obj_layer_top_temperature.get()
    data_layer_base_temperature = sds_obj_layer_base_temperature.get()
    data_feature_classification_flags = sds_obj_feature_classification_flags.get()


    with open(filename, 'a') as f:
        a=len(data_profile_time)
        for i in range(0,a):
            var2 = ''
            var1 = data_layer_top_altitude[i]
            for j in range(0, len(data_layer_top_altitude[0])):
                # print(type(var1[j]))
                # print(data_layer_top_altitude[i])
                var2 += str(var1[j])
                var2 += ' '                  #这个步骤就是将数组内部的元素进行遍历,然后再在一行输出

            if var2=="-9999.0 -9999.0 -9999.0 -9999.0 -9999.0 -9999.0 -9999.0 -9999.0 -9999.0 -9999.0 ":
                var2=""                      #这是为了筛掉无效数据,因为-9999.0是无效数据,只能占用内存,没有别的作用

            var4 = ''
            var3 = data_layer_base_altitude[i]
            for j in range(0, len(data_layer_base_altitude[0])):
                var4 += str(var3[j])
                var4 += ' '
            var6 = ''
            var5 = data_layer_top_pressure[i]
            for j in range(0, len(data_layer_top_pressure[0])):
                var6 += str(var5[j])
                var6 += ' '
            var8 = ''
            var7 = data_layer_base_pressure[i]
            for j in range(0, len(data_layer_base_pressure[0])):
                var8 += str(var7[j])
                var8 += ' '
            var10 = ''
            var9 = data_layer_top_temperature[i]
            for j in range(0, len(data_layer_top_temperature[0])):
                var10 += str(var9[j])
                var10 += ' '
            var12 = ''
            var11 = data_layer_base_temperature[i]
            for j in range(0, len(data_layer_base_pressure[0])):
                var12 += str(var11[j])
                var12 += ' '
            var14 = ''
            var13 = data_feature_classification_flags[i]
            for j in range(0, len(data_feature_classification_flags[0])):
                var14 += str(var13[j])
                var14 += ' '
            var16 = ''
            var15 = data_profile_time[i]
            for j in range(0, len(data_profile_time[0])):
                var16 += str(var15[j])
                var16 += ' '
            var18 = ''
            var17 = data_longitude[i]
            for j in range(0, len(data_longitude[0])):
                var18 += str(var17[j])
                var18 += ' '
            var20 = ''
            var19 = data_latitude[i]
            for j in range(0, len(data_latitude[0])):
                var20 += str(var19[j])
                var20 += ' '
            strs = var16 + "  " + var18 + "  " + var20 + "  " + var2 + "  " + var4 + "  " + var6 + "  " + var8 + "  " + var10 + "  " + var12 + "  " + var14 + "\n"
            if var2=="":
                strs=""
            # strs=var16+"  "+var18+"  "+var20+"  "+var2+"  "+var4+"  "+var6+"  "+var8+"  "+var10+"  "+var12+"  "+var14+"\n"
            f.write(strs)
            strs=''

这里我学到的一些东西,比如说,1、如何遍历数组的元素啊,以后列表字典的都是可以套用的。

               2、如何用循环创建多个文件

               3、numpy的基本运用

慢慢学习,慢慢积累,争取每天都有进步!

 

 


 

Posted on 2018-03-15 16:02  小萝卜头12138  阅读(2088)  评论(0编辑  收藏  举报