Python Exec возвращает больше строк, чем ожидалось

Во-первых, я хотел бы задать этот вопрос так: «Да, я знаю, что мне не следует использовать exec, однако моим данным доверяют».

У меня есть скрипт, который создает в файле кучу строк словаря по умолчанию. Каждая строка содержит ключ, значения времени, данные. Я выполняю процесс, чтобы вывести их на график, однако последняя строка, кажется, печатается дважды, поэтому у моего графика есть проблемы.:

рассматриваемая часть кода:

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 оператора печати, чтобы помочь мне донести свою точку зрения:

показать и рассказать 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 или что?


person user1441079    schedule 14.06.2012    source источник
comment
Последняя строка вашего файла - пустая строка.   -  person Dan D.    schedule 14.06.2012
comment
И поэтому, когда цикл доходит до него, имя data не привязывается к новому значению, когда происходит строка exec(line), и, таким образом, остается привязанным к предыдущему значению.   -  person Dan D.    schedule 14.06.2012
comment
@ДанД. не должен ли line.strip() избавиться от него, если это пустая строка?   -  person user1441079    schedule 14.06.2012
comment
@ДанД. неважно, я добавил if not line: continue перед exec (строкой), и это решает проблему. Спасибо за ваше понимание.   -  person user1441079    schedule 14.06.2012
comment
@ДанД. Вы хотите добавить свой комментарий в качестве ответа, чтобы я мог его принять?   -  person user1441079    schedule 14.06.2012


Ответы (1)


Последняя строка вашего файла - пустая строка.

И поэтому, когда цикл доходит до него, имя data не привязывается к новому значению, когда происходит строка exec(line), и, таким образом, остается привязанным к предыдущему значению.

person Dan D.    schedule 14.06.2012