如何在python中读取文档的特定部分

时间:2013-11-07 23:23:46

标签: python python-2.7 coding-style

我有一张图片中显示的文件。 我想检索fileid,作者和描述。 在某些fileid中,没有该文件的描述。 但是在某些fileid(即fileid = 3)中,有一个文件的描述。 我想知道如何在Python中获得desctiion。 谢谢。

start=re.compile('<file fileid=(\d+)\s*>')
end=re.compile('</file\s*>')

The Document starts from here:
--------------------------------------
<file fileid=11>
System File 765411
J.K
STAV December, 1959
</file>

<file fileid=12>
Batch File
James P.
STAV December, 1959
</file>

<file fileid=13>
Empty file
Person:Wolfe, P.
STAV December, 1959

This is a description of the empty file.
You need to put this file in the D:\location\systemB.
After putting the file to the location, the system will boot up.
Later, System B will refresh itself and show the output. 
</file>

<file fileid=14>
Nomal File
Mercy Lusia
STAV December, 1959
</file>

3 个答案:

答案 0 :(得分:1)

一种非常简单的方法是读取文件的每一行,直到用

到达一行

<file fileid=xx>。然后读取所有数据,直到结束</file>标记

答案 1 :(得分:0)

我也会匹配这些标签之间的内容;然后你可以按换行符分割来接收部分和可选的描述。

>>> files = re.findall('<file fileid=(\d+)\s*>\s*(.*?)</file\s*>', s, re.S)
>>> for fileid, file in files:
        title, author, date, description = file.split('\n', 3)
        print(title)
        print(author)
        print(date)
        print(description.strip())
        print('----')

System File 765411
J.K
STAV December, 1959

----
Batch File
Person: James P.
STAV December, 1959

----
Empty file
Person:Wolfe, P.
STAV December, 1959
This is a description of the empty file.
You need to put this file in the D:\location\systemB.
After putting the file to the location, the system will boot up.
Later, System B will refresh itself and show the output.
----

您甚至可以创建文档字典:

documents = {}
for fileid, file in files:
    title, author, date, description = file.split('\n', 3)
    documents[fileid] = { 'title' : title, 'author' : author, 'date' : date }
    if description.strip():
         documents[fileid]['description'] = description.strip()

答案 2 :(得分:0)

由于你已经编写了两个正在运行的正则表达式,让我们从那里开始。

您可以start.split(document),然后对于每一个,end.split(the_one)[0]file节点的内容。

更简单地说,只需将开始和结束正则表达式结合起来,中间有一个(.*?),现在你有一个模式可以找到文件节点,并为你提供fileid值和内容。只需rfile.find_allfind_iter,这样您就可以在达到自己关心的人时停止。

或者,更简单地说,只需使用仅搜索您关注的模式,将(\d+)替换为硬编码的数字(或您填写的{} .format)。

或者,更简单地说,完全删除正则表达式 - start是一个固定的子字符串,直到\s*>,所以只需使用普通的子字符串搜索(如str.index)来查找它,然后对下一个</file进行子字符串搜索,最外面的><之间的所有内容都是您的内容。

如果您想知道如何在整个文件上运行正则表达式或普通子字符串搜索,如果它足够小,read将整个文件放入内存中;如果它太大了,mmap文件进入虚拟页面空间;如果那个太大了(除非你使用的是32位Python,否则这种情况不太可能......但是你可能会这样做),你将不得不读取重叠的缓冲区。