2016-03-09 3 views
3

Я хочу объединить 2 строки текста в один, но только когда они оба не являются пустыми. Например:Объедините две строки, если они не пусты

1:1 Bob drives his car. 
1:2 Bob and his wife are going on a trip. 
They will have an awesome time on the beach. 

Я хочу, чтобы поместить их в словарь, как это:

dict[1:1] gives me "Bob drives his car." 
and dict[1:2] must give me "Bob and his wife are going on a trip.They will have an awesome time on the beach." 

Я знаю, как исправить кулак один (dict[1:1]), но я понятия не имею, как я могу взять два предложения вместе.

Или есть вариант, что если за предложением следует другой, вы можете поместить их на одну строку? Это всего лишь пример на самом деле, файл содержит 100000 строк.

+0

являются пояснительные '1: 1 'в самом файле? – merlin2011

+0

Да, они есть. Он идет от 1: 1 до 1:25, затем от 2: 1 до 2:25. И так далее. – Aleandro

ответ

1

Вы можете сделать это, как это - читать одну строку за один раз из файла, и где есть пустая строка вызвать начало нового раздела.

start_new_section = True 
key = None 
output = {} 
with open('file.txt', 'r') as f: 
    for line in f: 
     if line == '': 
      start_new_section = True 
     elif start_new_section: 
      words = line.split(' ') 
      key = words[0] 
      output[key] = ' '.join(words[1:]) 
      start_new_section = False 
     else: 
      output[key] += line 

print(output) 

Или опрятнее вариант той же идеи:

key = None 
output = {} 
with open('file.txt', 'r') as f: 
    for line in f: 
     if not line: 
      key = None 
     elif key: 
      output[key] += line 
     else: 
      key, _, output[key] = line.partition(' ') 
+0

Oke Я попробую этот код завтра. Благодаря! – Aleandro

0

Возможный способ решить эту проблему состоит в том, чтобы один раз пройти через ваш файл и составить список индексов, начинающихся с численного значения. Затем вы можете использовать индексы для создания своего словаря, потому что знаете, что каждые 2 числа в ваших индексах содержат один элемент, который следует вставить в словарь.

0

Предполагая, что файл достаточно мал, чтобы вы могли прочитать все это в памяти, вы можете использовать регулярные выражения для разбора блоков. Вот example in action.

import re 

with open('file.txt', 'r') as f: 
    txt = f.read() 

matches = re.findall(r'^(\d+:\d+) (.+?)$(?=(?:\s^\d+:\d+)|\z)', txt, flags=re.M | re.S) 
d = {m[0]: m[1].replace(r'\n', '') for m in matches} 
+0

Да, это могло бы сделать работу. Но на самом деле проблема более сложная, чем мои примеры. Но могу ли я запустить код, подобный этому, только для своего рефакторинга. Итак, файл становится: '> 1: 1 Боб водит машину. > > 1: 2 Боб и его жена отправляются в путешествие. У них будет замечательное время на пляже. > ' – Aleandro

+0

Как ваш файл более сложный? В вашем файле фактически содержатся символы '>' на каждой строке? –

+0

Нет «>», означает начало строки. Но можно ли изменить файл. Итак, две линии друг за другом без новой строки между ними. Будет ли изменено в одну строку? – Aleandro

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