【问题标题】:Python - can text file data be stored in code?Python - 文本文件数据可以存储在代码中吗?
【发布时间】:2016-04-15 04:33:32
【问题描述】:

我正在编写一个需要大量日期查找(财政年度、月份、周)的程序。为了简化查找​​,我创建了一个字典,其中键是日期(用于查找),值是类对象。我将类 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 而不是给它预定的大小。然后我考虑创建一个或多个字典,但考虑到我拥有的数据量以及我必须通过这些字典阅读以创建另一个类对象字典的事实,这似乎是压倒性的。好像不太对。

除了将数据存储在单独的文本文件中并在代码中读取之外,任何人都可以建议一种不同的方法来填充我的类对象字典吗?

【问题讨论】:

  • 你可以有字典文字。如果您打印(或pretty print)您的字典,您应该能够将其按原样嵌入到您的代码中。

标签: python class dictionary


【解决方案1】:

当然 - 将文本放在一个长字符串中,以 ''' 或 """ 开头并在空行上以相同的序列结束。

我主要在有一些我想要解析的文字 xml 的地方使用它,其中 xml 是原始格式,所以我不想在它改变时解析-然后-打印-然后-粘贴-进入-python-文件。只需粘贴即可替换 xml。

长字符串看起来像这样:

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,不知道你为什么要打开你的文本文件“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

【讨论】:

    【解决方案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'))}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      相关资源
      最近更新 更多