Python:读取文本文件的一部分
大家好
我刚开始学习Python和编程。我需要从一个很大的文本文件中分块读取内容,格式大概是这样的:
<word id="8" form="hibernis" lemma="hibernus1" postag="n-p---nb-" head-"7" relation="ADV"/>
我需要里面的 form
、lemma
和 postag
信息。比如上面的例子,我需要 hibernis
、hibernus1
和 n-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()
。