2013-07-26 2 views
0

У меня есть текстовый файл в форматеPython: Добавление дополнительных строк в список, созданные с StartsWith()

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

Вы можете использовать «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) 
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)

+0

Ваше решение может быть легко изменено для обеспечения пространства в текстах - добавьте параметр 'maxsplit = 1'' в' 'line.split (" ") ''. И, возможно, 'lstrip()' следует вызывать на 'line' перед его расщеплением. И 'd' может быть обычным dict,' defaultdict() 'не нужно :) – Abgan

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 

поэтому у вас есть 2-буквенный код в группе (1), текст после этого в группе (2).

0

Ваш текст выглядит YAML файл за исключением каких-либо двоеточием (:)

, если вы можете изменить автор этого файла (если таковые имеются), как этот синтаксис:

AN: 
    text 
    text 

вы можете использовать YAML парсер.