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が返されます。

助言がありますか?

4

4 に答える 4

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

そうすれば、より短いリストのケースを好きなように処理できます!

于 2012-04-18T13:41:23.033 に答える
4

@Hooked は Python2 に対して良い答えを出しました。Python3 では*タプルのアンパックにも機能するため、次のことができます。

f_email, f_title, *f_description = tokens

詳細はPEP 3132にあります

于 2012-04-18T13:45:17.573 に答える
1

message.split('\n', 2) を使用すると、1 行目、2 行目、残りの行の 3 つの部分が得られます。

このフォームを使用してください:

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()
于 2012-04-18T14:27:37.817 に答える
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
于 2012-04-18T13:48:54.277 に答える