【问题标题】:NameError: name '`Timevalue`' is not definedNameError:名称“时间值”未定义
【发布时间】:2018-05-18 21:34:25
【问题描述】:

我将数据存储在 csv 文件中,如下所示:

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”未定义 我怎样才能使Timevalue 变量全局化以避免这个问题? 谢谢

【问题讨论】:

  • 最后一行有错字:Timetvalue vs Timevalue
  • @Val 是重命名变量的类型错误。
  • 确实,TimeValue 不在范围内

标签: python python-3.x csv dictionary elasticsearch


【解决方案1】:

('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]

请注意,这样做效率较低,因为它必须测试每个键以确保它不是时间键。


要将数据保存在OrderedDicts 的列表中,我们需要稍微改变一下逻辑。我们还需要正确创建OrderedDicts,以便项目按所需顺序排列。

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')])]

【讨论】:

  • 感谢您的回答。我通过在代码的开头声明字符串变量Timevalue来解决这个问题。您将字典存储在列表中。如何获取列表中 dic 的存储项目(值/键)的访问权限。因为我想将它们存储在 doc 变量中,正如您在上面的代码中看到的那样:
  • @AhmyOhlin 不清楚您要对名为 docdict 做什么。我假设它应该在for 循环之外,否则每次循环迭代都会创建一个新的doc 并丢弃旧的。
  • doc 是 Elasticsearch 中用于存储数据的结构。我的目的是将每一项数据存储在新变量中,如下所示:doc = {'Device':Device, 'Measure':Value , 'Time':Timevalue } 我尝试循环 for d in new_data: print(d) for key, value in d.items(): Device = key Value = value "Time " in key: Timevalue= value doc = {'Device':Device, 'Measure':Value , 'Time':Timevalue }` it适用于设备和价值,但我不知道如何将时间存储在新变量中?
猜你喜欢
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
相关资源
最近更新 更多