2017-03-22 4 views
0

VOLTTRONプラットフォームにExternalDataエージェントを実装して、CAISO OASISデータベースからCSVデータを抽出しています。 OASISは、XMLまたはCSVのいずれかのデータを含む.zipファイルを返します。私はぞんざいにCSVデータを処理する前に、私は、ファイルオブジェクトへの結果の.csvファイルをアーカイブを解凍して開くこと_handle_csv機能を変更することで、欲しかったCSVデータを取得することができた:私はVOLTTRONにExternalDataエージェントを実装してCAISO OASISからデータを取得しています

def _handle_csv(self, headers, request, url, source_topic, source_params): 
    key_column = source_params.get("key", "") 
    flatten = source_params.get("flatten", False) 
    parse_columns = source_params.get("parse", []) 

    # I am expecting a zip archive containing a csv file 
    # so this is a workaround to read the zipfile and extract the csv 
    # by creating a file object with open() after extracting 
    # TODO find another way to get data w/o opening file so we dont 
    # have to do housekeeping 
    z = zipfile.ZipFile(StringIO(request.content)) 
    fname = z.namelist() 
    z.extractall() 
    file_obj = open(fname[0], 'r') 

    # orig. file object assignment assuming request already in csv format 
    # file_obj = StringIO(request.content) 

私が見つけるしたいと思いますこれを行うより良い方法で、.csvを閉じてファイルを削除するなど、過剰なハウスキーピングをしなくても、ファイルがエージェントデータディレクトリにスタックしないようにする必要はありません。任意の提案をいただければ幸いです。

答えて

0

ZipFile.openメソッドを使用します。 Docs

結果として、オブジェクトのようなファイルをCSVパーサーに渡すことができます。

file_obj = z.open(fname[0]) #Remove the extractall() call and this should do the trick. 
+0

私はPythonのドキュメントでそれをスキップしているに違いありません。私はそれを試みます。 – jmattfeld

+0

あなたは大歓迎です。これはおそらくエージェントに追加するための良い機能です。この機能をご希望の場合は、https://github.com/VOLTTRON/volttron/issues –

関連する問題