Python:读取文本文件的一部分

4 投票
9 回答
8710 浏览
提问于 2025-04-15 12:06

大家好

我刚开始学习Python和编程。我需要从一个很大的文本文件中分块读取内容,格式大概是这样的:

<word id="8" form="hibernis" lemma="hibernus1" postag="n-p---nb-" head-"7" relation="ADV"/>

我需要里面的 formlemmapostag 信息。比如上面的例子,我需要 hibernishibernus1n-p---nb-

我该怎么告诉Python去读取直到遇到form,然后继续读取直到遇到引号 ",再读取引号之间的内容 "hibernis"?我对此感到很困惑。

到目前为止,我尝试过去除标点符号,分割句子,然后从列表中提取我需要的信息。不过,我在让Python遍历整个文件时遇到了麻烦,目前只能让它处理一行。我的代码如下:

f=open('blank.txt','r')
quotes=f.read()
noquotes=quotes.replace('"','')
f.close()

rf=open('blank.txt','w')
rf.write(noquotes)
rf.close()   

f=open('blank.txt','r')
finished = False
postag=[]
while not finished:
   line=f.readline()
   words=line.split()
   postag.append(words[4])
   postag.append(words[6])
   postag.append(words[8])              
   finished=True

希望能得到一些反馈或批评

谢谢

9 个回答

1

你的文件是正确的XML格式吗?如果是的话,可以试试SAX解析器:

import xml.sax
class Handler (xml.sax.ContentHandler):
   def startElement (self, tag, attrs):
       if tag == 'word':
           print 'form=', attrs['form']
           print 'lemma=',attrs['lemma']
           print 'postag=',attrs['postag']

ch = Handler ()
f = open ('myfile')
xml.sax.parse (f, ch)

(这个代码有点粗糙,可能不是完全正确的)。

2

我建议使用正则表达式模块:re

也许可以试试这样的方式?

#!/usr/bin/python
import re

if __name__ == '__main__':
    data = open('x').read()
    RE = re.compile('.*form="(.*)" lemma="(.*)" postag="(.*?)"', re.M)
    matches = RE.findall(data)
    for m in matches:
        print m

这段代码假设每一行都是以<word ...>开头的,并且每个部分的顺序都是固定的,而且你不需要处理完整的xml解析。

5

如果你要处理的是XML格式的数据,可以使用ElementTree来解析它:

from xml.etree import ElementTree

line = '<word id="8" form="hibernis" lemma="hibernus1" postag="n-p---nb-" head="7" relation="ADV"/>'

element = ElementTree.fromstring(line)

对于每一个XML元素,你可以很简单地提取出它的名称和所有的属性:

>>> element.tag
'word'
>>> element.attrib
{'head': '7', 'form': 'hibernis', 'postag': 'n-p---nb-', 'lemma': 'hibernus1', 'relation': 'ADV', 'id': '8'}

所以如果你的文档里有很多word类型的XML元素,像下面这样就能从每一个元素中提取你想要的信息:

from xml.etree import ElementTree

XML = '''
<words>
    <word id="8" form="hibernis" lemma="hibernus1" postag="n-p---nb-" head="7" relation="ADV"/>
</words>'''

root = ElementTree.fromstring(XML)

for element in root.findall('word'):
    form = element.attrib['form']
    lemma = element.attrib['lemma']
    postag = element.attrib['postag']

    print form, lemma, postag

如果你只有文件名的话,使用parse()而不是fromstring()

撰写回答