2012-06-14 18 views
0

首先我想前提这个问题,“是的,我知道我不应该使用exec,但是我的数据是可信的。”Python执行返回更多的行然后期望

我有一个脚本,在文件中创建一堆默认字典行。每行包含关键值,时间值,数据。我经历一个过程来获得这些成图,但是,最后一行似乎打印两次,所以我的图表有问题:问题

代码部分:

import fileinput 
import matplotlib 
matplotlib.use('Agg') 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 
from pylab import * 

filein = 'list.txt' 
output_name = "image2.png" 
dicts = [] 
times = [] 
values = [] 

temp_csv_open = open(temp_csv, "a") 

line = "" 
for line in fileinput.input([filein]): 
     line = line.replace("defaultdict(<type 'int'>,", "data = ") 
     line = line.replace(")", "") 
     line = line.strip() 
     print line # show and tell 1 
     exec(line) 
     print data # show and tell 2 
     for k in sorted(data.iterkeys()): 
       print k, data[k] # show and tell 3 
       time = datetime.datetime.strptime(k, "%Y%m%d%H") 
       times.append(time) 
       values.append(data[k]) 
print times, values # show and tell 4 

我的数据:

defaultdict(<type 'int'>, {'2012021310': 76422, '2012021311': 94188, '2012021323': 139363, '2012021312': 111817, '2012021307': 71316, '2012021306': 82418, '2012021305': 65217, '2012021313': 127002, '2012021314': 141099, '2012021315': 147830, '2012021316': 136330, '2012021317': 122252, '2012021318': 118619, '2012021319': 115763, '2012021322': 137658, '2012021321': 130022, '2012021320': 121393, '2012021309': 69406, '2012021308': 66833}) 
defaultdict(<type 'int'>, {'2012021408': 139745, '2012021409': 143658, '2012021414': 288286, '2012021418': 31216, '2012021416': 268214, '2012021400': 207878, '2012021401': 269296, '2012021402': 270258, '2012021403': 275882, '2012021404': 232521, '2012021405': 195062, '2012021406': 166669, '2012021407': 142855, '2012021417': 245582, '2012021411': 194360, '2012021413': 262078, '2012021410': 158954, '2012021415': 296457, '2012021412': 237083}) 
defaultdict(<type 'int'>, {'2012021523': 676350, '2012021522': 670147, '2012021521': 650984, '2012021520': 617401, '2012021501': 170448, '2012021503': 246600, '2012021502': 250013, '2012021505': 363866, '2012021504': 300809, '2012021507': 333080, '2012021506': 370454, '2012021509': 343671, '2012021508': 330452, '2012021512': 549736, '2012021513': 622690, '2012021510': 387871, '2012021511': 456171, '2012021516': 647559, '2012021517': 600969, '2012021514': 692257, '2012021515': 706377, '2012021518': 579669, '2012021519': 587969}) 
defaultdict(<type 'int'>, {'2012021608': 333986, '2012021609': 344126, '2012021602': 651692, '2012021603': 676458, '2012021600': 664484, '2012021601': 686408, '2012021620': 932692, '2012021621': 1065501, '2012021604': 589033, '2012021605': 465191, '2012021623': 1316907, '2012021606': 389669, '2012021607': 342613, '2012021619': 828190, '2012021618': 617836, '2012021622': 1111334, '2012021611': 467532, '2012021610': 387220, '2012021613': 634585, '2012021612': 560227, '2012021615': 718498, '2012021614': 704008, '2012021617': 606396, '2012021616': 665030}) 

在上面的代码中,我已经添加了4个print语句来帮助我做我的观点:

展示和说明1返回:

data = {'2012021310': 76422, '2012021311': 94188, '2012021323': 139363, '2012021312': 111817, '2012021307': 71316, '2012021306': 82418, '2012021305': 65217, '2012021313': 127002, '2012021314': 141099, '2012021315': 147830, '2012021316': 136330, '2012021317': 122252, '2012021318': 118619, '2012021319': 115763, '2012021322': 137658, '2012021321': 130022, '2012021320': 121393, '2012021309': 69406, '2012021308': 66833} 
data = {'2012021408': 139745, '2012021409': 143658, '2012021414': 288286, '2012021418': 31216, '2012021416': 268214, '2012021400': 207878, '2012021401': 269296, '2012021402': 270258, '2012021403': 275882, '2012021404': 232521, '2012021405': 195062, '2012021406': 166669, '2012021407': 142855, '2012021417': 245582, '2012021411': 194360, '2012021413': 262078, '2012021410': 158954, '2012021415': 296457, '2012021412': 237083} 
data = {'2012021523': 676350, '2012021522': 670147, '2012021521': 650984, '2012021520': 617401, '2012021501': 170448, '2012021503': 246600, '2012021502': 250013, '2012021505': 363866, '2012021504': 300809, '2012021507': 333080, '2012021506': 370454, '2012021509': 343671, '2012021508': 330452, '2012021512': 549736, '2012021513': 622690, '2012021510': 387871, '2012021511': 456171, '2012021516': 647559, '2012021517': 600969, '2012021514': 692257, '2012021515': 706377, '2012021518': 579669, '2012021519': 587969} 
data = {'2012021608': 333986, '2012021609': 344126, '2012021602': 651692, '2012021603': 676458, '2012021600': 664484, '2012021601': 686408, '2012021620': 932692, '2012021621': 1065501, '2012021604': 589033, '2012021605': 465191, '2012021623': 1316907, '2012021606': 389669, '2012021607': 342613, '2012021619': 828190, '2012021618': 617836, '2012021622': 1111334, '2012021611': 467532, '2012021610': 387220, '2012021613': 634585, '2012021612': 560227, '2012021615': 718498, '2012021614': 704008, '2012021617': 606396, '2012021616': 665030} 

但是这里的地方的问题是:展示和说明2返回:

{'2012021307': 71316, '2012021306': 82418, '2012021305': 65217, '2012021309': 69406, '2012021310': 76422, '2012021311': 94188, '2012021312': 111817, '2012021313': 127002, '2012021314': 141099, '2012021315': 147830, '2012021316': 136330, '2012021317': 122252, '2012021318': 118619, '2012021319': 115763, '2012021308': 66833, '2012021321': 130022, '2012021320': 121393, '2012021323': 139363, '2012021322': 137658} 
{'2012021408': 139745, '2012021409': 143658, '2012021403': 275882, '2012021418': 31216, '2012021400': 207878, '2012021416': 268214, '2012021402': 270258, '2012021414': 288286, '2012021404': 232521, '2012021405': 195062, '2012021406': 166669, '2012021407': 142855, '2012021417': 245582, '2012021411': 194360, '2012021401': 269296, '2012021413': 262078, '2012021410': 158954, '2012021415': 296457, '2012021412': 237083} 
{'2012021523': 676350, '2012021522': 670147, '2012021521': 650984, '2012021520': 617401, '2012021501': 170448, '2012021503': 246600, '2012021502': 250013, '2012021505': 363866, '2012021504': 300809, '2012021507': 333080, '2012021506': 370454, '2012021509': 343671, '2012021508': 330452, '2012021512': 549736, '2012021513': 622690, '2012021510': 387871, '2012021511': 456171, '2012021516': 647559, '2012021517': 600969, '2012021514': 692257, '2012021515': 706377, '2012021518': 579669, '2012021519': 587969} 
{'2012021605': 465191, '2012021608': 333986, '2012021609': 344126, '2012021602': 651692, '2012021603': 676458, '2012021600': 664484, '2012021601': 686408, '2012021606': 389669, '2012021607': 342613, '2012021622': 1111334, '2012021623': 1316907, '2012021620': 932692, '2012021621': 1065501, '2012021619': 828190, '2012021618': 617836, '2012021604': 589033, '2012021611': 467532, '2012021610': 387220, '2012021613': 634585, '2012021612': 560227, '2012021615': 718498, '2012021614': 704008, '2012021617': 606396, '2012021616': 665030} 
{'2012021605': 465191, '2012021608': 333986, '2012021609': 344126, '2012021602': 651692, '2012021603': 676458, '2012021600': 664484, '2012021601': 686408, '2012021606': 389669, '2012021607': 342613, '2012021622': 1111334, '2012021623': 1316907, '2012021620': 932692, '2012021621': 1065501, '2012021619': 828190, '2012021618': 617836, '2012021604': 589033, '2012021611': 467532, '2012021610': 387220, '2012021613': 634585, '2012021612': 560227, '2012021615': 718498, '2012021614': 704008, '2012021617': 606396, '2012021616': 665030} 

如此明显的问题是在哪里的是,随着2012021605来自何处开始最后一行。在我使用exec时有什么不对吗?

+3

文件的最后一行是空行。 –

+1

因此,当循环到达它时,当'exec(行)'行发生并且因此保持绑定到先前的值时,名称'data'不会被重新绑定到新值。 –

+0

@DanD。不应该line.strip()摆脱它,如果它是一个空行? – user1441079

回答

1

文件的最后一行是空行。

正因如此,当循环到达时,data的名称在行exec(line)发生时不会回弹到新值,因此仍然绑定到先前的值。