2016-01-10 19 views
3

我正在寫一個程序,需要大量的日期查找(財年,月,周)。爲了簡化查找​​,我創建了一個Dictionary,其中Key是日期(用於查找),Value是類對象。我把類def和代碼讀取日期數據(一個.txt文件)在單獨的文件,而不是主文件。順便說一句,這不是一個關於Date對象的問題。 的代碼是:Python - 可以將文本文件數據存儲在代碼中嗎?

# filename: MYDATES 
class cMyDates: 
    def __init__(self, myList): 
     self.Week_Start = myList[1] 
     self.Week_End = myList[2] 
     self.Week_Num = myList[3] 
     self.Month_Num = myList[4] 
     self.Month  = myList[5] 
     self.Year  = myList[6] 
     self.Day_Num  = myList[7] 

d_Date = {} # <-- this is the dictionary of Class Objects 
# open the file with all the Dates Data 
myDateFile = "myDates.log" 
f = open(myDateFile, "rb") 
# parse the Data and add it to the Dictionary 
for line in f: 
    myList = line.replace(' ','').split(',') 
    k = myList[0] 
    val = cMarsDates(myList) 
    d_Date[k] = val 

的實際日期數據,從文本文件,是通過逗號隔開只是長串:(也這些字符串的尺寸爲了清楚減小,如-是類DEF 初始化

2012-12-30, 2012-12-30, 2013-01-05, 1, 12, Dec, 2012, 30, Sun 
2012-12-31, 2012-12-30, 2013-01-05, 1, 12, Dec, 2012, 31, Mon 

在我的主程序我導入此數據:

import MYDATES as myDate 

在這裏,我可以訪問我的dictionar y這樣的對象:

myDate.d_Date 

一切工作正常。我的問題:有沒有辦法將這些數據以某種方式存儲在Python代碼中,而不是在單獨的文本文件中?該計劃將永遠需要這些相同的信息,並且永遠不會改變。這就像一個榮耀的靜態變量。我想如果我可以把它保存在一個.pyc文件中,那麼它可能會運行得更快。好吧,在你提到'更快'或者讀取外部數據和創建詞典所花費的時間之前,我需要花費很多時間......不需要很長時間(平均約爲0.00999秒,我以此爲基準)。這個問題僅僅是爲了我的啓迪 - 如果我需要再次做這樣的事情,但是在時間「可能」很重要的更大範圍內。

我想將日期數據存儲在一個數組(來自VB思維)或列表(Python),並將其提供給字典對象,但它似乎只能.append到列表,而不是給予它是一個預定的大小。然後我想到了創建字典或字典,但考慮到我擁有的數據量以及我必須通過這些字典來創建另一個類對象字典的事實,這似乎讓人感到壓倒性的。這看起來不正確。

任何人都可以建議一種不同的方式來填充我的類對象字典,除了將數據存儲在單獨的文本文件中並通過它讀取代碼?

+0

你可以有字典文字。如果您打印(或[漂亮打印](https://docs.python.org/2/library/pprint.html))您的字典,您應該可以將其嵌入代碼中。 –

回答

2

您可以列表文字:

values = [1, 2, 3, 4] 

另外一個字典文字:

d = {'2012-12-30': cMyDates(['2012-12-30', '2012-12-30', '2013-01-05', 1, 12, 'Dec', 2012, 30, 'Sun']), 
    '2012-12-31': cMyDates(['2012-12-31', '2012-12-30', '2013-01-05', 1, 12, 'Dec', 2012, 31, 'Mon'])} 

你可能需要一個合適的構造函數的類,而不是通過一個列表:

class cMyDates: 
    def __init__(self, Week_Start, Week_End, Week_Num, Month_Num, Month, Year, Day_Num): 
     self.Week_Start = Week_Start 
     self.Week_End = Week_End 
     self.Week_Num = Week_Num 
     self.Month_Num = Month_Num 
     self.Month  = Month 
     self.Year  = Year 
     self.Day_Num  = Day_Num 

然後你可以字面看起來是這樣,這是一個要好很多:

d = {'2012-12-30': cMyDates(Week_Start='2012-12-30', 
          Week_End='2013-01-05', 
          Week_Num=1, 
          Month_Num=12, 
          Month='Dec', 
          Year=2012, 
          Day=30, 
          Day_Num='Sun'), 
    '2012-12-31': cMyDates(Week_Start='2012-12-31', 
          Week_End='2013-01-05', 
          Week_Num=1, 
          Month_Num=12, 
          Month='Dec', 
          Year=2012, 
          Day=31, 
          Day_Num='Mon'))} 
1

當然 - 置於longstring文本,通過以「」」或‘’開始」,並在一個空行相同的序列整理表示

我用這主要是在那裏我有一些文字XML我想解析一下,其中xml是原始格式,所以我不想在解釋後再打印,然後粘貼到python文件中,只要做一個粘貼來替換xml就簡單多了。

Longstring看起來IKE在此:

dates='''2012-12-30, 2012-12-30, 2013-01-05, 1, 12, Dec, 2012, 30, Sun 
2012-12-31, 2012-12-30, 2013-01-05, 1, 12, Dec, 2012, 31, Mon 
''' 

顯然,你^ h ave解析了這一點 - 如果你使用StringIO打開一個類似文件的界面的字符串,你的解析應該保持不變。

順便說一句,如果不是單獨打開,而是使用with語句,關閉文件就會整齊地處理,無論是否有例外。 BTW2,不知道你爲什麼要打開你的文本文件「rb」 - 你應該使用「rt」。 修改後的代碼看起來是這樣的:

with open(myDateFile, "rt") as f: 
    # parse the Data and add it to the Dictionary 
    for line in f: 
     myList = line.replace(' ','').split(',') 
     k = myList[0] 
     val = cMarsDates(myList) 
     d_Date[k] = val 

或者,我認爲這應該工作(未經測試,它的晚):

import io.StringIO as StringIO 
with StringIO.StringIO(dates) as f: 
    # parse the Data and add it to the Dictionary 
    for line in f: 
     myList = line.replace(' ','').split(',') 
     k = myList[0] 
     val = cMarsDates(myList) 
     d_Date[k] = val 
相關問題