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。

有什么建议么?

4

4 回答 4

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

这样,您就可以按照自己喜欢的方式处理较短的列表!

于 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

如果您不想将文本作为一个整体使用,并且不低于 3.x 以使用漂亮的 splat 解包,您可以简单地这样做:

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 回答
1

当您使用 message.split('\n', 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()
于 2012-04-18T14:27:37.817 回答