2

次のコードは、複数行の入力で実行すると、「そのような属性はありません_ParseResuls__tokdict」というエラーを表示します。

1行のファイルでは、エラーは発生しません。ここに示されている2行目または3行目をコメントアウトすると、ファイルの長さに関係なく、そのエラーも発生しません。

for line in input:
    final = delimitedList(expr).parseString(line)
    notid = delimitedList(notid).parseString(line)
    dash_tags = ', '.join(format_tree(notid))

    print final.lineId + ": " + dash_tags

誰かがここで何が起こっているのか知っていますか?

編集:提案されているように、他の人がエラーを再現できるように完全なコードを追加しています。

from pyparsing import *

#first are the basic elements of the expression

#number at the beginning of the line, unique for each line
#top-level category for a sentiment
#semicolon should eventually become a line break

lineId = Word(nums)
topicString = Word(alphanums+'-'+' '+"'")
semicolon = Literal(';')

#call variable early to allow for recursion
#recursive function allowing for a line id at first, then the topic,
#then any subtopics, and so on. Finally, optional semicolon and repeat.
#set results name lineId.lineId here
expr = Forward()
expr << Optional(lineId.setResultsName("lineId")) + topicString.setResultsName("topicString") + \
Optional(nestedExpr(content=delimitedList(expr))).setResultsName("parenthetical") + \
Optional(Suppress(semicolon).setResultsName("semicolon") + expr.setResultsName("subsequentlines"))

notid = Suppress(lineId) + topicString + \
Optional(nestedExpr(content=delimitedList(expr))) + \
Optional(Suppress(semicolon) + expr)



#naming the parenthetical portion for independent reference later
parenthetical = nestedExpr(content=delimitedList(expr))


#open files for read and write
input = open('parserinput.txt')
output = open('parseroutput.txt', 'w')

#defining functions

#takes nested list output of parser grammer and translates it into
#strings suited for the final output
def format_tree(tree):                                                                                            
    prefix = ''
    for node in tree:
        if isinstance(node, basestring):
            prefix = node
            yield node
        else:
            for elt in format_tree(node):
                yield prefix + '_' + elt

#function for passing tokens from setResultsName
def id_number(tokens):
    #print tokens.dump()
    lineId = tokens
    lineId["lineId"] = lineId.lineId

def topic_string(tokens):
    topicString = tokens
    topicString["topicString"] = topicString.topicString

def parenthetical_fun(tokens):
    parenthetical = tokens
    parenthetical["parenthetical"] = parenthetical.parenthetical

#function for splitting line at semicolon and appending numberId
#not currently in use
def split_and_prepend(tokens):
    return '\n' + final.lineId


#setting parse actions
lineId.setParseAction(id_number)
topicString.setParseAction(topic_string)
parenthetical.setParseAction(parenthetical)


#reads each line in the input file
#calls the grammar expressed in 'expr' and uses it to read the line and assign names to the tokens for later use
#calls the 'notid' varient to easily return the other elements in the line aside from the lineId
#applies the format tree function and joins the tokens in a comma-separated string
#prints the lineId + the tokens from that line
for line in input:
    final = delimitedList(expr).parseString(line)
    notid = delimitedList(notid).parseString(line)
    dash_tags = ', '.join(format_tree(notid))

    print final.lineId + ": " + dash_tags

入力ファイルは、次の2行のtxtドキュメントです。

1768    dummy; data
1768    dummy data; price
4

1 に答える 1

2

で使用すると、の再割り当てによりnotid2回目の反復が中断されdelimitedListます。3行目notidは、コードの前半で定義された式を破棄するため、最初の反復でのみ機能します。notidの割り当てには別の名前を使用してください。

于 2012-04-29T00:05:24.817 に答える