我有一个格式为
的文本文件AN text
text
TI text
AU text
text
text
CS text
SO text
AN text
TI text
AU text
text
CS text
text
SO text
等,其中有两个大写字母的关键字,后面是一个或多个额外行的附加文字。
关键字后面的行数可能会有所不同,因此我不能仅仅获取下一个或两个,但关键字的顺序保持不变。
我想要做的是从选择的这些关键字中获取所有文字(例如AN
,AU
和SO
。我开始使用readlines()
来解析文件,然后使用:
sorted_text = []
for line in file:
if line.startswith('AN'):
line = line.rstrip('\n')
sorted_text.append(line)
之后一切都会出错!我的目标是然后将列表中的下一行附加到此列,除非它以TI
开头,但是任何elif / else循环我似乎尝试追加太多额外的行。
这是解决此类问题的明智之举,还是有更好的方法入手?
答案 0 :(得分:0)
您可以使用“currentKey”变量来跟踪您看到的当前关键字:
currentKey = ''
sorted_text = []
keywords = set(['AN', 'AU', 'SO'])
for line in file:
if line.startswith('AN'):
currentKey = 'AN'
elif line.startswith('TI'):
currentKey = 'TI'
elif line.startswith('AU'):
currentKey = 'AU'
elif line.startswith('CS'):
currentKey = 'CS'
elif line.startswith('SO'):
currentKey = 'SO'
if currentKey in keywords:
line = line.rstrip('\n')
sorted_text.append(line)
答案 1 :(得分:0)
试试这个
from collections import defaultdict
d, k = defaultdict(), None
for line in open(r"C:\Temp\test.txt"):
data = [s for s in line.split(" ") if s != ""]
if len(data) > 1: k, t = data[0], data[1]
else: t = data[0]
d[k] = d.get(k, "") + t
print d
如果您想将文字放入列表,请将d[k] = d.get(k, "") + t
更改为d.setdefault(k, []).append(t)
答案 2 :(得分:0)
使用正则表达式:
>>> import re
>>> exp=re.compile(r'^([A-Z]{2})(.+?)(?=(^[A-Z])|\Z)',re.S| re.VERBOSE | re.MULTILINE)
>>> for s in exp.finditer(ifile): print('|',s.group(1),'>',s.group(2))
...
| AN > text
text
| TI > text
| AU > text
text
text
| CS > text
| SO > text
| AN > text
| TI > text
| AU > text
text
| CS > text
text
| SO > text
>>> print(ifile)
AN text
text
TI text
AU text
text
text
CS text
SO text
AN text
TI text
AU text
text
CS text
text
SO text
所以你在组(1)中有2个字母的代码,在组(2)中有文本。
答案 3 :(得分:0)
您的文字看起来像YAML文件,但没有冒号(:)
如果您可以像这样的语法修改此文件的编写器(如果有的话):
AN:
text
text
您可以使用YAML解析器。