Python - 文本文件数据可以存储在代码中吗?

时间:2016-01-10 23:07:37

标签: python class dictionary

我正在编写一个需要大量日期查找(会计年度,月份,周)的程序。为了简化查找​​,我创建了一个Dictionary,其中Key是一个日期(用于查找),Value是一个Class Object。我把类def和代码读取到单独文件中的日期数据(.txt文件),而不是主文件。顺便说一下,这不是关于Date对象的问题。 代码是:

# 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 init

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

从这里我可以像这样访问我的字典对象:

myDate.d_Date

一切正常。我的问题:有没有办法以某种方式将这些数据存储在python代码中,而不是在单独的文本文件中?该程序将始终需要相同的信息,它永远不会改变。它就像一个美化的静态变量。我想如果我可以将它保存在.pyc文件中,那么它可能运行得更快。好吧,在你向我跳过关于“更快”或者读取外部数据并创建字典所花费的时间之前......它不需要很长时间(平均约0.00999秒,我对它进行基准测试)。问题仅仅在于我的启发 - 如果我需要再次做这样的事情,但是在时间“可能”很重要的更大范围内。

我想过将日期数据存储在一个数组(来自VB思考)或List(Python)中,并将其提供给字典对象,但似乎只能.append到List而不是给它预定的大小。然后我考虑创建一个字典或字典,但考虑到我拥有的数据量以及我必须通过这些字典阅读以创建另一个类对象字典这一事实,这似乎是压倒性的。这似乎不对。

除了将数据存储在单独的文本文件中并通过代码读取数据之外,是否可以建议使用不同的方法来填充我的类对象字典?

2 个答案:

答案 0 :(得分: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 :(得分:1)

当然 - 将文字放在一个长串中,用“&#39;&#39;&#39;或&#34;&#34;&#34;并在空行上以相同的顺序完成。

我主要使用这个我需要解析的文字xml,其中xml是原始格式,因此我不想在每次调用时解析然后打印然后粘贴到python文件变化。只是做一个粘贴来替换xml就容易多了。

Longstring看起来像这样:

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

显然你必须解析它 - 如果你使用StringIO打开一个类似文件的接口的字符串,你的解析应该保持不变。

顺便说一下,如果不是单独打开,而是使用with语句,关闭文件会得到整齐处理,无论例外情况如何。 BTW2,不知道为什么要打开文本文件&#34; rb&#34; - 你应该使用&#34; rt&#34;。 修改后的代码如下所示:

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