2

私は名前と年齢のファイルを持っています、

john 25 
bob 30 
john bob 35

これが私がこれまでに持っているものです

from pyparsing import *

data = '''
    john 25 
    bob 30 
    john bob 35
'''

name = Word(alphas + Optional(' ') + alphas)

rowData = Group(name +
                Suppress(White(" ")) +
                Word(nums))

table = ZeroOrMore(rowData)

print table.parseString(data)

私が期待している出力は

[['john', 25], ['bob', 30], ['john bob', 35]]

これがスタックトレースです

Traceback (most recent call last):
  File "C:\Users\mccauley\Desktop\client.py", line 11, in <module>
    eventType = Word(alphas + Optional(' ') + alphas)
  File "C:\Python27\lib\site-packages\pyparsing.py", line 1657, in __init__
    self.name = _ustr(self)
  File "C:\Python27\lib\site-packages\pyparsing.py", line 122, in _ustr
    return str(obj)
  File "C:\Python27\lib\site-packages\pyparsing.py", line 1743, in __str__
    self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig)
  File "C:\Python27\lib\site-packages\pyparsing.py", line 1735, in charsAsStr
    if len(s)>4:
TypeError: object of type 'And' has no len()
4

2 に答える 2

3

pyparsingよりクリーンな文法を書くことができるように、空白を自動的に取り除きます。したがって、名前パーサーは次のようになります。

# Parse for a name with an optional surname
# Note that pyparsing is built to accept "john doe" or "john        doe"
name = Word(alphas) + Optional(Word(alphas))

そして、行パーサー:

# Parses a row of a name and an age
row = Group(name) + Word(nums)

([(['john', 'doe'], {}), '25'], {})ただし、行ごとにかなり複雑な構造になりますが、これを操作する方法を理解していただければ幸いです。文字列全体を解析するためにpyparsingを実際に使用するのではなく、データが行ベースの場合は、行ごとに繰り返し解析することをお勧めします。物事を簡単にする、と私は思います:

for line in input_string.splitlines():
    results = row.parseString(line)
    # Do something with results...
于 2012-10-25T16:56:57.357 に答える
0

次のコードは、組み込みの文字列ライブラリを使用して問題を解決する可能性があります。

def main():
    f = open('filename.txt')
    fe = open('ERROR.TXT','w+')
    for line in f.readlines():
        # print line,
        lst = line.split()
        try:
            name = lst[0]
            age = lst[1]

        # process name and age valuse

        except IndexError as e:
            print e
            fe.write(e)
        except IOError as e:
            print e
            fe.write(e)

if __name__ == '__main__':
     main()
于 2012-10-25T17:17:55.640 に答える