2012-07-27 74 views
1

我已经花了很大一部分今天摔跤与这一个 - 我正在从串行端口服务器设备(通过套接字模块)读取数据。数据进入OK状态,我正在尝试对它进行简单的字符串处理(确认正确的数据块大小),然后添加时间戳并将完整的块放入字典中,并将时间戳作为关键字。这里是代码:Python - 如何映射和追加列表条目动态字典

for i in range(0, (len(rawData)+1)): 
    if len(rawData[i]) == 57: 
     ss2000_data[str(time.time())] = (rawData[i].split(', ')) 
     print ss2000_data 
    else: continue 

字典处理是好的,因为我得到一个有效的键:值对 - 一次!循环部分不工作,所以无论我收到多少串行数据,我只会得到一个键:值对。

我在这里扫描了问题,也在Python.org论坛,并且还阅读了文档“学习Python”,“Python Pocket Ref”和python.org上的Python教程,但是我没有到任何地方。我也是Python的亲戚。我会很感激任何建议或指向潜在的信息来源。 由于提前,十分赞赏

+1

你的字典只能得到一个条目,但那些'print ss2000_data'语句呢?你看到不止一个吗? – azhrei 2012-07-27 04:54:28

+1

'else:continue'?看起来有点不必要。 – 2012-07-27 05:11:32

+0

@azhrei:不,我只打印1个条目 – 2012-07-27 12:46:35

回答

1

(我将假定RAWDATA包含从串行连接一些线路/数据报。)

time.time()不能保证提供几分之一秒。对于time.time(),您可能处理得太快以提供除初始值之外的任何内容。尝试将str(i)添加到您用于存储拆分数据的密钥中,或者使用另一个密钥(可能来自i),该密钥保证随每个循环而改变。

+0

我使用的str(time.time())构造旨在为过程工具的一行串行数据提供一个键。这样创建的计时数据对于过程数据的时间标记是有用的,另外我很舒服,这将确保没有重复的键。对时间延迟的了解非常有用。我会探讨这一点。谢谢! – 2012-07-27 12:54:34

+0

我不认为计时会成为一个问题,因为在早期版本的代码中,我实际上在每个串行数据字符串的开始处添加了一个时间戳,但随后出现问题时将第一项作为关键字一个dict()构造,所以我走了这条路。我也认为我可以用更少的代码得到我想要的东西!我想我会回去重新访问早先的想法。 – 2012-07-27 13:22:53

+0

我重构了代码,因此我只会在每次调用此模块时“剔除”一个完整的数据块,然后使用此信息返回单个词典条目,避免由于此调用的延迟而导致的潜在延迟。迭代循环。谢谢! – 2012-08-02 00:31:23

1

如果您只能打印1个条目,那意味着rawData中只有1个条目的长度为57,对吧?

清理代码,并添加一些调试。保持简单并接近你有什么:

for block in rawData: 
    print 'Block,len=%d' % (len(block),) 
    if len(block) == 57: 
    ss2000_data[str(time.time())] = (block.split(', ')) 
    print ss2000_data 

如果你希望在RAWDATA超过1项,它具有57的长度,那么你肯定“数据在确定来了”?

+0

嘿,Azhrei,谢谢你。我敢肯定它的工作原理是因为代码中的更多内容我只是按照你的建议做的......我打印rawData,并且得到了正确长度的多个块。我必须重新访问这个代码来检查时间问题,但是上面的块长度打印短语比我所做的更好。 – 2012-07-27 21:01:20

+0

使用了错误的格式,这里再次发表评论......感谢。我敢肯定它的工作原理是因为代码中的更多内容我只是按照你的建议做的......我打印rawData,并且得到了正确长度的多个块。 – 2012-08-01 17:21:16