, поэтому я хотел бы из файла input.txt
создать два словаря
, например, вот пример файла input.txt
@. VAR @first=Billy
@. VAR @last=Bob
@. PRINT VARS
@. VAR @petName=Gato
@. VAR @street="1234 Home Street"
@. VAR @city="New York"
@. VAR @state=NY
@. VAR @zip=21236
@. VAR @title=Dr.
@. PRINT VARS
@. FORMAT LM=5 JUST=LEFT
@. PRINT FORMAT
, поэтому VAR @varName=value
то есть в случае @first=Billy
вы получите что-то вроде varDict = {"first": "Billy"}
верно? Теперь я хочу знать, как это сделать через весь файл
Есть два словаря, которые мне нужно заполнить, один для переменных и один для FORMAT, который просто содержит значения, на самом деле ничего не делает на данный момент.
Что касается требуемого вывода, во входном файле есть команды, которые при чтении будут инициировать либо добавление переменных в каталог, либо печать этого каталога, либо добавление в каталог форматирования. Я бы использовал такую функцию pprint pprint.pprint(varDict , width=30)
и вывел бы что-то вроде этого
{'first': 'Billy',
'last': 'Bob'}
{'city': 'New York',
'first': 'Billy',
'last': 'Bob',
'petName': 'Gato',
'state': 'NY',
'street': '1234 Home Street',
'title': 'Dr.',
'zip': '21236'}
{'BULLET': 'o',
'FLOW': 'YES',
'JUST': 'LEFT',
'LM': '5',
'RM': '80'}
К сожалению, я постоянно получаю сообщения об ошибках в драйвере и исходном файле
AttributeError: 'list' object has no attribute 'groups'
TypeError: expected string or buffer
Driver.py
input=(sys.argv[1])
# Group 1. VAR
# Group 2. @first=Mae or JUST=RIGHT FLOW=NO
# pass Group 2 as atString
regexSearch = re.compile(r'^@. ([A-Z]+) (.*)', re.MULTILINE)
regexPrintVAR = re.compile(r'^@\.\s*PRINT\s(VARS)', re.MULTILINE)
regexPrintFORMAT = re.compile(r'^@\.\s*PRINT\s(FORMAT)',re.MULTILINE)
regexERRCheck = re.compile(r'^@\.\s*FORMAT\s+BAD', re.MULTILINE)
varDictionary = dict()
formatDictionary = {"FLOW":"YES", "LM":"1", "RM":"80","JUST":"LEFT","BULLET":"o"}
file = open(input, "r")
while True:
inputLine = file.readline()
matchObj = regexSearch.search(inputLine)
command, atString = matchObj.groups()
if command == "VAR":
setVariable(atString,varDictionary)
if command == "FORMAT":
formatListERR = regexERRCheck.search(inputLine)
if formatListERR != None:
print("*** Not a recognizable command")
line = file.readline()
setFormat(atString, formatDictionary)
if command == "PRINT":
printVARObj = regexPrintVAR.search(inputLine)
printFormatObj = regexPrintFORMAT.search(inputLine)
if printVARObj != None:
pprint.pprint(varDictionary, width=30)
elif printFormatObj != None:
pprint.pprint(formatDict, width=30)
inputLine = file.readline()
file.close()
importFileIUse.py
# The atString is the remainder of the string after the VAR or FORMAT key word.
varDictionary = dict()
formatDictionary = {"FLOW":"YES", "LM":"1", "RM":"80","JUST":"LEFT","BULLET":"o"}
def setFormat(atString,formatDictionary):
regexFormat = re.compile(r'((?:(?:\w+)=(?:\w+)\s*)*)$')
line = re.split(" +", atString)
formatList = regexFormat.search(line)
if formatList:
for param in formatList[0].split():
splitParam = param.split('=')
formatDictionary[splitParam[0]] = splitParam[1]
def setVariable (atString, varDictionary):
regexVAR = re.compile(r'@(\w+)=(\w+|.*)\s*$', re.MULTILINE)
# file = open(input)
# line = file.readline()
# line = re.split(" +", atString)
#while line:
varList = regexVAR.findall(atString)
for key, value in varList:
varDictionary[key] = value