2012-04-18 4 views
1

У меня есть строка:Форматирование разрывы строк в питона строк

f = open("file.txt", r) 
message = f.read() 

print message 
>>> "To: email\ntitle: add title here\nDescription: whatever here\n" 

можно разделить строку, выполнив:

f_email, f_title, f_description, blank = message.split('\n') 

Но проблема возникает тогда, когда у меня есть сообщение вроде этого:

"To: email\ntitle: add title here\nDescription: first line\nSecond line\nthirdline\n" 

Когда я разбиваю строку, она также разбивает описание. Я пробовал:

f_email, f_title, f_description, blank = message.split('\n',4) 

Но это, очевидно, возвращает ValueError, потому что раскалывает больше 4 \ N.

Любые предложения?

+0

Если «название» «К» и всегда по своей собственной линии без внутренних переносами, можно просто разделить на ' \ n', где первый элемент - это электронная почта, второе название и '' \ n'.join (therest) 'для тела? –

+0

Возможно, вы можете просто прочитать файл по строкам. – Akavall

ответ

4

При запуске .split('\n') вы возвращаете список. Вместо того, чтобы присвоить переменные, когда вы разделяете, вы можете вытащить их из списка:

tokens = message.split('\n') 
f_email = tokens[0] 
f_title = tokens[1] 
f_description = tokens[2] 

Это может быть менее хрупким, проверив размер списка. Если вы знаете, что нужно, по крайней мере три элемента, вы можете:

assert(len(tokens)>=3) 

Другой способ обойти это, чтобы обернуть вещи вверх в try/except блоке:

tokens = message.split('\n') 
try: 
    f_description = tokens[2] 
except: 
    f_description = None 

Таким образом, вы можете обрабатывать для более короткого списка, который вам нравится!

+0

Удивительное спасибо! – Neeran

4

@ Женат дал хороший ответ для Python2. Поскольку в Python3 * работы также для кортежа распаковке, вы можете сделать:

f_email, f_title, *f_description = tokens 

Подробности в PEP 3132

+0

Arg, я как раз собирался опубликовать это;) +1, это приятное решение для пользователей 3.x. –

+0

для полноты, вы можете присоединиться к элементам f_description с помощью \ n, чтобы восстановить исходную строку описания. – covertCoder

+0

Кроме того, решение в этом духе может быть адаптировано к Python2, передавая «токены» методу, который выполняет обработку. –

1

Если вы не хотите использовать текст в целом, а не под 3 .x использовать хороший пейнтбольный распаковку, вы просто можете сделать это следующим образом:

email = None 
title = None 
description = "" 
with open("test.txt", "r") as f: 
    for number, line in enumerate(f): 
     if number == 0: 
      email = line.strip() 
     elif number == 1: 
      title = line.strip() 
     else: 
      description += line 
+0

+1: Спасибо вам большое, но код может выглядеть немного длинным, если у меня очень длинная строка из файла. – Neeran

1

При использовании message.split («\ п», 2) вы получаете три части: первая линия, вторая линия и остальные линии в одном.

Используйте эту форму:

f = open("file.txt") 
f_email, f_title, f_description = f.read.split('\n', 2) 
f.close() 

Или это:

f = open("file.txt") 
f_email = f.readline() 
f_title = f.readline() 
f_description = f.read() 
f.close() 
Смежные вопросы