Python:将其他行附加到使用startswith()创建的列表

2024-04-19 19:33:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个格式的文本文件

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

等,其中有两个大写字母的关键字,后面是一行或多行的附加文本。在

关键字后面的行数可能会有所不同,因此我不能仅获得下一行或两行,但关键字的顺序保持不变。在

我想做的是从这些关键字中获取所有文本(例如,ANAU和{})。我首先使用readlines()解析文件,然后使用:

^{pr2}$

在那之后一切都变糟了!我的目标是将列表中的下一行追加到这一行,除非它以TI开头,但是任何elif/else循环我似乎都试图附加太多额外的行。在

这是解决这类问题的明智方法吗?还是有更好的方法开始?在


Tags: 文件方法text文本anso顺序格式
3条回答

试试这个

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)

使用正则表达式:

>>> 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)组后面的文本。在

您可以使用“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)

相关问题 更多 >