【问题标题】:Parsing big text files with python specific syntax使用 python 特定语法解析大文本文件
【发布时间】:2014-03-20 09:52:37
【问题描述】:

我正在尝试使用 python 解析大文本文件。

这些文件的语法如下:

<option1> {
<variable1>=<value1>; //<comment> 
<variable2>=<value2>;
..
<variableN>=<valueN>; //<comment> 
}

<option2> {
<variable1>=<value1>; //<comment> 
<variable2>=<value2>;
..
<variableN>=<valueN>; //<comment> 
}

...
...

<optionN> {
<variable1>=<value1>; //<comment> 
<variable2>=<value2>;
..
<variableN>=<valueN>; //<comment> 
}

我想获得例如&lt;optionK&gt;[&lt;variableT&gt;] 值。

是否有使用文件解析器的最佳方法来做到这一点?

【问题讨论】:

  • @sshashank124:OP 说文件很大;正则表达式会要求您将整个文件读入内存,这可能不是最实用的建议?
  • @MartijnPieters:mmap 允许您将正则表达式应用于大文件。见How to read tokens without reading whole line or file
  • 你可以尝试类似lepl(已停产)来解析文件,这里是code example
  • @JFSebastian:现在无法查找,但前几天 Jon Clements 发现如果文件大于可用内存,则无法查找。但我在那里没有第一手经验,我很乐意听从你的意见。我自己会逐行读取文件检测部分。
  • @MartijnPieters:我的回答明确表示 “即使文件不适合内存,它也可以工作。” 如果我没有尝试过,我不会这么说它。我也不会使用单个正则表达式来解析文件。我只是提到它是说有可能

标签: python parsing text-files


【解决方案1】:

考虑你上面的例子(丑陋的解决方案)你可以使用http://docs.python.org/2/library/htmlparser.html如下:

test = """
<option1> {
<variable1>=<value1>; //<comment>
<variable2>=<value2>;
..
<variableN>=<valueN>; //<comment>
}

<option2> {
<variable1>=<value1>; //<comment>
<variable2>=<value2>;
..
<variableN>=<valueN>; //<comment>
}

...
...

<optionN> {
<variable1>=<value1>; //<comment>
<variable2>=<value2>;
..
<variableN>=<valueN>; //<comment>
}

"""

from HTMLParser import HTMLParser

# create a subclass and override the handler methods
class MyHTMLParser(HTMLParser):
    option = ""
    key = ""
    value = ""
    r = {}
    def handle_starttag(self, tag, attrs):
        self.currentTag = tag
        print "Encountered a start tag:", tag
        if "option" in tag:
            #self.r = {}
            self.option = tag
            self.r[self.option] = {}
        elif "{" in self.currentData or "=" not in self.currentData and "//" not in self.currentData:
            self.key = tag
            self.r[self.option][self.key] = ""
        elif "=" in self.currentData:
            self.value = tag
            self.r[self.option][self.key] = self.value
            #print self.r
    def handle_endtag(self, tag):
        self.currentData = None
        print "Encountered an end tag :", tag
    def handle_data(self, data):
        self.currentData = data
        print "Encountered some data  :", data
        #find a condition to yield result here "}" ? 

# instantiate the parser and fed it some HTML
parser = MyHTMLParser()  
parser.feed(test) 
print parser.r

【讨论】:

    猜你喜欢
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 2012-08-09
    • 2012-12-27
    • 1970-01-01
    • 2015-04-27
    相关资源
    最近更新 更多