2017-12-05 4 views
1

に定義されていない私はfollwingとしてCSVファイルのデータを格納します。NameError:名前 '`Timevalue`' が

row = dict_items([('Time ': '2017-12-01T13:54:04'), ('Energy [kWh]': '0.01'), ('Voltage [V]': '221.64'), ('Current [A]': '0.08')]) 

今私はそのようにそれを保存したい:

('Time ': '2017-12-01T13:54:04', 'Energy [kWh]': '0.01'), 
('Time ': '2017-12-01T13:54:04','Voltage [V]': '221.64'), 
('Time ': '2017-12-01T13:54:04','Current [A]': '0.08')]) 

ので、私はこれを書きましたコード怒鳴ると私は、このエラーを得た

Device="" 
    Value="" 
    for key, value in row.items(): 
     print(row.items()) 
     if key == 'Time': 
      Timevalue = value 
      print(Zeitvalue) 
     Device = key 
     Value = value 
     doc = {'Device':Device, 'Measure':Value , 'Time':Timevalue } 

を定義します。 NameError:名「Timevalueは」01を定義されていませんTimevalue変数globaleをこの問題を回避するにはどうすればよいですか? ありがとう

+0

あなたは最後の行にタイプミスがあります: '' 'TIMEVALUE – Val

+0

@val thas対Timetvalue'は、変数の名前を変更のタイプミスでした。 – AhmyOhlin

+0

確かに、TimeValueは範囲内にありません – Val

答えて

0

その('Time ': '2017-12-01T13:54:04', 'Energy [kWh]': '0.01')構文は有効ではありませんPython。実際に辞書のリストが必要だと仮定すると、その変換を実行するのは難しくありません。

タイムスタンプを取得して、他の各アイテムと組み合わせることができるようにしてから、残りのアイテムを新しい構造に簡単にコピーできるようにすることができます。これは、関数に渡された元のdictを変更することに注意してください。それが必要でない場合は、渡されたdictのコピーを作成するか、ifテストをループに入れて、新しい項目にデータをコピーして、時間項目をスキップします。

def convert(old): 
    time_key = 'Time ' 
    # Save the time 
    time_item = (time_key, old[time_key]) 
    # Add remove it 
    del old[time_key] 
    # Copy remaining items to new dicts and save them in a list 
    return [dict([time_item, item]) for item in old.items()] 

row = { 
    'Time ': '2017-12-01T13:54:04', 
    'Energy [kWh]': '0.01', 
    'Voltage [V]': '221.64', 
    'Current [A]': '0.08', 
} 

new_data = convert(row) 
for d in new_data: 
    print(d) 

出力

{'Time ': '2017-12-01T13:54:04', 'Energy [kWh]': '0.01'} 
{'Time ': '2017-12-01T13:54:04', 'Voltage [V]': '221.64'} 
{'Time ': '2017-12-01T13:54:04', 'Current [A]': '0.08'} 

は、ここでは、オリジナルの辞書を変異またはコピーしたくない場合は、それを行う方法は次のとおりです。

def convert(old): 
    time_key = 'Time ' 
    # Save the time 
    time_item = (time_key, old[time_key]) 
    # Copy other items to new dicts and save them in a list 
    return [dict([time_item, (key, val)]) 
     for key, val in old.items() if key != time_key] 

注これがあることタイムキーではないことを確認するためにすべてのキーをテストする必要があるため、効率が低下します。


OrderedDict秒のリストにデータを保存するには、我々は少しロジックを変更する必要があります。また、項目が希望の順序になるようにOrderedDictを適切に作成する必要があります。

from collections import OrderedDict 
from pprint import pprint 

def convert(row): 
    time_key = 'Time ' 
    time_value = row[time_key] 
    new_data = [] 
    for key, val in row.items(): 
     if key == time_key: 
      continue 
     new_data.append(OrderedDict(Device=key, Measure=val, Time=time_value)) 
    return new_data 

row = { 
    'Time ': '2017-12-01T13:54:04', 'Energy [kWh]': '0.01', 
    'Voltage [V]': '221.64', 'Current [A]': '0.08' 
} 

new_data = convert(row) 
pprint(new_data) 

出力

[OrderedDict([('Device', 'Energy [kWh]'), 
       ('Measure', '0.01'), 
       ('Time', '2017-12-01T13:54:04')]), 
OrderedDict([('Device', 'Voltage [V]'), 
       ('Measure', '221.64'), 
       ('Time', '2017-12-01T13:54:04')]), 
OrderedDict([('Device', 'Current [A]'), 
       ('Measure', '0.08'), 
       ('Time', '2017-12-01T13:54:04')])] 
+0

あなたの答えをありがとう。私はコードのbegininigの文字列変数 'Timevalue'を宣言することでこの問題を解決しました。 辞書をリストに格納しました。どのように私はリストに格納された項目(値/キー)のアクセスを得ることができます。上記の私のコードで見られるように、それらをdoc変数に格納したいからです。 – AhmyOhlin

+0

@AhmyOhlin 'doc'という名前の' dict'で何をしようとしているのかははっきりしません。私はそれが 'for'ループの外にあると仮定します。そうでなければ、各ループ反復は新しい' doc'を作成し、古いループを投げ捨てます。 –

+0

'doc'はデータを格納するためのElasticsearchの構造体です。 私の目的は、以下のstrucurとして新しい変数のデータのすべての単一のアイテムを格納することである。 'DOC = {「端末」:デバイス、「測定」:値、「時間」:TIMEVALUE} ' iはforループ試み 'NEW_DATAにおけるDについて: TIMEVALUE =値 'DOC = {」:キーで デバイス=キー 値=値 "時間": プリント(D)キーの 、d.items()の値デバイス ':デバイス 『測定』:値、 『時間』:TIMEVALUE} ' それは、デバイスとの値で動作しますが、私は新しい変数で時間を格納することができます方法を知っていけませんか? – AhmyOhlin

関連する問題