2012-04-18 10 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) 

しかし、それはより4 \ n個のを分割しているため、それは明らかとValueErrorを返します。

提案がありますか?

+0

は、あなただけの 'に分割することができ\ n '、ここで最初の要素は電子メール、2番目のタイトルで、 '' \ n '。 –

+0

ファイルを1行ずつ読むだけかもしれません。 – Akavall

答えて

4

.split('\n')を実行すると、リストが返されます。あなたが分割したときに変数を割り当てるのではなく、あなたはリストからそれらを引くことができます。これは、リストのサイズをチェックして壊れにくく行うことができ

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

。あなたはそれが、少なくとも3つの要素が必要とわかっている場合は、次のことができます。これを回避するために

assert(len(tokens)>=3) 

別の方法try/exceptブロック内のものをラップすることです:

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

あなたが扱うことができますこの方法あなたが好きな正確な方法をより短いリストの場合!

+0

すばらしいおかげで! – Neeran

4

@Hookedは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、あなたはこのようにそれを行うだけですることができます:あなたはmessage.splitを使用する場合

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

は(「\ n」を、2)あなたは三つの部分を取得する:最初の行、2行目の残りを1つの行。

このフォームを使用:

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()