2016-09-09 3 views
0

Я попытался найти похожие вопросы, но не смог найти. Пожалуйста, отметьте как дубликат, если есть похожие вопросы.Чтение повторяющейся информации из файла в другом порядке в Python

Я пытаюсь выяснить способ чтения и сбора нескольких сведений из одного файла. Здесь в файле Block-A, B & C повторяются в случайном порядке, а Block-C имеет более одной информации для захвата. Каждый блок заканчивается текстом «END». Здесь входной файл:

Block-A: 
(info1) 
END 
Block-B: 
(info2) 
END 
Block-C: 
(info3) 
(info4) 
END 

Block-C: 
(info7) 
(info8) 
END 
Block-A: 
(info5) 
END 
Block-B: 
(info6) 
END 

Вот мой код:

import re 
out1 = out2 = out3 = "" 
a = b = c = False 
array=[] 

with open('test.txt', 'r') as f: 

    for line in f: 
     if line.startswith('Block-A'): 
      line = next(f) 
      out1 = line 
      a = True 
     if line.startswith('Block-B'): 
      line=next(f) 
      out2 = line 
      b = True 
     if line.startswith('Block-C'): 
      c = True 

     if c: 
      line=next(f) 
      if not line.startswith('END\n'): 
       out3 = line 
       array.append(out3.strip()) 

     if a == b == c == True: 
      print(out1.rstrip() +', ' + out2.rstrip() + ', ' + str(array)) 
      a = b = c = False 
      array=[] 

Спасибо заранее за ваши ценные входы.

ответ

1

Используйте словарь для данных из каждого блока. Когда вы читаете строку, которая запускает блок, задайте переменную для этого имени и используйте ее в качестве ключа в словаре.

out = {} 
with open('test.txt', 'r') as f: 
    for line in f: 
     if line.endswidth(':'): 
      blockname = line[:-1] 
      if not blockname in out: 
       out[blockname] = '' 
     elif line == 'END' 
      blockname = None 
     else if blockname: 
      out[blockname] += line 
print(out) 
+0

он прекрасно работает. Очень эффективный. Есть ли способ распечатать результаты после чтения блока-A, B & C каждый раз? – Bharathi

+0

Вы можете распечатать его в 'if line == 'End':' code. – Barmar

0

Если вы не хотите, чтобы блок-X для печати, unhash Элиф Постулаты

import os 
data = r'/home/x/Desktop/test' 

txt = open(data, 'r') 

for line in txt.readlines(): 
    line = line[:-1] 
    if line in ('END'): 
     pass 
    #elif line.startswith('Block'): 
     # pass 
    else: 
     print line 
>>>> 
Block-A: 
(info1) 
Block-B: 
(info2) 
Block-C: 
(info3) 
(info4) 
Block-C: 
(info7) 
(info8) 
Block-A: 
(info5) 
Block-B: 
(info6) 
+0

Я ищу печать каждого блока Block-A, B, C, все 3 блока считываются. – Bharathi

+0

Вы ищете распечатку по строкам? – StmWtr

+0

В каждой строке, каждый A, B & C info A: (info1) B: (info2) C: (info3) (info4) A: (info5) B: (info6) C: (info7) (info8) – Bharathi

Смежные вопросы