Python - могут ли данные текстового файла храниться в коде?
Я пишу программу, которая требует много поиска даты (финансовый год, месяц, неделя). Чтобы упростить поиск, я создал словарь, в котором ключ - это дата (используется для поиска), а значение - объект класса. Я поместил класс 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 к списку вместо придания ему заранее определенного размера, Затем я подумал о создании словаря или словарей, но это казалось ошеломляющим, учитывая количество данных, которые у меня есть, и тот факт, что мне пришлось бы читать через эти словари, чтобы создать еще один словарь объектов класса. Это не казалось правильным.
Кто-нибудь может предложить другой способ заполнить мой словарь объектов класса, кроме хранения данных в отдельном текстовом файле и чтения через них в коде?
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'))}
Конечно - поместите текст в длинную строку, обозначенную, начиная с '''или "" и заканчивая той же последовательностью в пустой строке.
Я использую это в основном там, где у меня есть какой-то буквальный 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